1. MPC response overview

As of 11 April 2023, a total of 448,317 persons or 90,324 families have been reached by MPC interventions. A total of USD 13.3 million has been disbursed by 17 implementing agencies across 28 sub-districts.

With only certain exceptions (such as activities specified as non-MPC cash-for-food), only beneficiaries who have received at least USD 100/family/month have been included.


448,000 people reached with MPC, USD 13.3 million disbursed, 11 April 2023

governorate

district

communities

partners

households

beneficiaries

total_usd

%_beneficiariesb

Aleppo

A'zaz

5

7

2,994

14,578

424,067

3.25

Aleppo

Afrin

75

10

25,162

125,312

3,726,192

27.95

Aleppo

Al Bab

3

2

998

5,011

137,791

1.12

Aleppo

Jarablus

1

3

589

2,805

88,350

0.63

Aleppo

Jebel Saman

15

8

9,226

53,754

1,380,550

11.99

Idleb

Harim

38

13

43,136

204,566

6,273,250

45.63

Idleb

Idleb

17

10

5,634

28,502

879,372

6.36

Idleb

Jisr-Ash-Shugur

21

3

2,585

13,789

350,200

3.08

Total

-

-

-

90,324

448,317

13,259,772

100.00

bAs percentage of all MPC beneficiaries reached in NW Syria;


177,525 beneficiaries were reached in February 2023 and 200,330 were reached in March 2023. 52,252 have been reached so far in April 2023.Changes in numbers of persons reached were due to cleaning and verification of the dataset – this process is still ongoing and will only be completed once the CWG fully transitions to 4W reporting.



1.1 Progress by date


The small number of beneficiaries reached earlier than February all pertained to the HRP, the only such beneficiaries reported so far. It is unclear if this is the extent of all January achievements.



2. Map of activities





3. Geographic breakdown of beneficiaries

Coverage continues to be highest in Afrin and Harim districts, which have been worst-hit by the earthquake.



Casualties and damaged houses, absolute figures and per 100,000 persons

governorate

district

wounded_dead1

wounded_dead_100k1

damaged_houses1

damaged_houses_100k1

Aleppo

A'zaz

356

57.87

276

44.86

Aleppo

Afrin

2,232

478.79

2,910

624.22

Aleppo

Al Bab

206

70.04

832

282.89

Aleppo

Jarablus

40

33.82

257

217.30

Aleppo

Jebel Saman

616

236.80

176

67.66

Idleb

Harim

8,449

507.65

3,230

194.07

Idleb

Idleb

350

48.23

946

130.37

Idleb

Jisr-Ash-Shugur

595

183.68

1,915

591.18

1Data from the Assistance Coordination Unit, Syria 20230328;


Below is a breakdown of beneficiaries based on whether they originate from camps or villages:


More than twice as many beneficiaries from villages as from camps

village_camps

beneficiaries

%_beneficiaries

camp

94,430

21.06

village

228,690

51.01

NA

125,197

27.93




3.1 By sub-district

The plots below show the breakdown of beneficiaries by sub-district. Caution must be taken to ensure that allocations are fair across the affected areas: there are numerous sub-districts where a very large proportion of the total population has already been reached by multi-purpose cash, in particular, Jandairis, Hairm, Salqin and Sharan.

Response activities must be proportional with the magnitude and severity of earthquake damage. Overallocation deprives affected persons of the aid they are due.

The average percentage of the population reached, of all sub-districts, is 10.63%.




3.2 Comparisons with PIN and earthquake damage

The plot below shows the total population of each sub-district on the x-axis (for the moment, all persons in these areas are assumed to be affected and are included in the PIN) and the number of beneficiaries on the y-axis.

The size of each point indicates the number of dead or wounded persons there per 100,000.



The higher or lower a sub-district is above the blue line, the more disproportionate the number of beneficiaries allocated to that location are.

This should also be compared to each sub-district’s share of the earthquake damage. Of particular note, sub-districts in grey have yet to receive any MPC assistance.



The CWG is currently working on a prioritisation score, which can be a useful shorthand, that will take into account pre-existing vulnerability (likely from the MSNA) as well as earthquake impacts.



3.3 Planned activities




4. Cash response actors and cash disbursed

In the scatterplot below, each point is a single cash working group partner. The x-axis indicates the number of beneficiaries reached per agency and the y-axis indicates the number of communities (admin4) reached.



USD 13.3 million has been distributed across 174 communities and 28 sub-districts in NW Syria.

The table below summarises the information in the scatterplot above in tabular form:


Reach and footprint of cash response actors

implementing_partner1

beneficiaries

districts

communities

CBRTWG-006

67,989

3

20

People in Need (PIN)

36,144

3

25

GOAL (GOAL)

34,310

3

70

CBRTWG-010

33,115

5

15

Norwegian Refugee Council (NRC)

20,900

2

5

CBRTWG-035

14,197

5

27

Mercy Without Limits

13,016

4

10

Bahar Organization (BO)

12,000

1

1

Agency for Technical Cooperation and Development (ACTED)

10,481

7

28

Uluslararasi Insani Yardimlasma Dernegi (IYD)

10,351

4

16

Syria Relief

9,750

5

7

Ihsan for Relief and Development

8,655

5

16

World Vision International (WVI)

7,008

1

4

Welthungerhilfe (WHH)

4,830

4

4

Ataa Humanitarian Relief Association (ATAA)

3,060

1

2

MASRRAT

2,692

3

3

Elaf for relief and development

1,750

1

1

1Only partners who provided more than USD 100/family/month;



4.1 USD disbursed per partner


USD disbursed and families reached by partner

implementing_partner

total_usd

families

usd_per_fam

%_usd_total

GOAL (GOAL)

2,998,650

19,991

150.00

22.61

CBRTWG-006

1,773,750

11,825

150.00

13.38

CBRTWG-010

1,590,100

11,287

140.88

11.99

Norwegian Refugee Council (NRC)

1,266,450

8,443

150.00

9.55

People in Need (PIN)

927,450

6,183

150.00

6.99

Ihsan for Relief and Development

854,250

5,695

150.00

6.44

Syria Relief

724,500

4,830

150.00

5.46

Agency for Technical Cooperation and Development (ACTED)

515,350

3,373

152.79

3.89

Mercy Without Limits

438,372

3,325

131.84

3.31

CBRTWG-035

409,800

4,098

100.00

3.09

Uluslararasi Insani Yardimlasma Dernegi (IYD)

375,000

2,500

150.00

2.83

Bahar Organization (BO)

360,000

2,400

150.00

2.71

Welthungerhilfe (WHH)

344,400

2,296

150.00

2.60

World Vision International (WVI)

301,200

2,008

150.00

2.27

Ataa Humanitarian Relief Association (ATAA)

177,000

1,180

150.00

1.33

Elaf for relief and development

122,500

350

350.00

0.92

MASRRAT

81,000

540

150.00

0.61


The CWG is currently working with other Clusters to consolidate all cash-based activities and will soon be able to provide more comprehensive reporting.




5. Annexes


5.1 Interactive reference table at sub-district level

Columns include: governorate, district, sub-district, total population, beneficiaries, total usd disbursed, wounded and dead, wounded and dead per 100k, damaged houses, damaged houses per 100k, admin3pcode



5.2 Reporting quality

This section documents issues encountered in the cleaning of 4W and FSL data and their impacts on the quality of reporting the CWG can provide.

Note that substantial cleaning has already taken place and these outstanding issues could not be resolved by the time of reporting.

However, the CWG recognises that not all reporting issues were due to partner error. The CWG will work with partners to continue improving reporting quality.


Still, one third of reporting originates from the FSL tracker

source

partners

beneficiaries

%_beneficiaries

4ws

11

308,417

68.79

fsl_tracker

7

139,900

31.21


Below is a breakdown of reporting by date:


January reporting is still largely incomplete

month

partners

beneficiaries

%_beneficiaries

Jan

2

3,778

0.84

Feb

8

177,525

39.60

Mar

10

200,330

44.68

Apr

5

52,252

11.66

1

14,432

3.22


Activities pertaining to 14,432 were missing their date or had dates in unreadable formats. However, the columns start date, end date and month of reporting were some of the most troublesome and consumed a large part of the time dedicated to data cleaning.

The CWG would like to reiterate that start date and end date should be entered in the format mm/dd/yyyy and that month of reporting should be selected from the dropdown menu.


12 partners have reported planned activities

project_status

partners

beneficiaries

%_beneficiaries

Completed

17

448,317

87.83

Planned

12

62,129

12.17

Suspended

1

0

0.00


The sum of planned beneficiaries is 62,129. If this is the extent of all planned MPC activities, the CWG as a whole can expect to reach around 77% of its target of 662,942 persons.

Below is a breakdown of planned actitivities by source:


Breakdown of planned activities by source

source

partners

beneficiaries

%_beneficiaries

4ws

7

40,542

65.25

fsl_tracker

5

21,587

34.75



5.3 Disaggregations

Of the 565 rows reported through the 4Ws (the FSL tracker does not ask for beneficiary disaggregations), only 32 have any values for the numbers of elderly persons reached.

The total number of elderly persons reached by the CWG partners is 3,190. The total number of beneficiaries reached is 448,317.

It is unclear how able partners are to comply with sex- and age-disaggregated reporting. 452 of the 565 rows reported through the 4Ws contain some form of sex-and-age disaggregation. Of these, only 366 rows have not copy/pasted the disaggregations from the MSNA (13% men, 27% women, 28% boys and 31% girls). For analysis purposes, these have been discarded. In future, it is always preferable to leave disaggregation columns blank as opposed to including values that have been backfilled from a census or a survey, especially as this backfilling will be done by OCHA as a final step in reporting anyway.

This is a histogram of the remaining values:



This differs quite significantly from what we would expect to see in the general population and is indicative of “unnatural” data i.e. copy/pasting or broad estimations, as opposed to actual counts. The peaks around 49% and 50% show that these same percentages were copy/pasted onto a large number of rows.

For reference, this the percentage of males as a proportion of the people in need per sub-district. The distribution is roughly normal and we can see that these are “real” figures.



Until such time copy/pasted values are excluded from the sex-and-age disggregations, it would be incorrect to estimate the number of men, women, boys and girls reached from the 4W values. This also means that it is not possible to determine if there is a skew towards either sex in our current programming.

LS0tDQp0aXRsZTogIk5vcnRod2VzdCBTeXJpYSBDYXNoIFdvcmtpbmcgR3JvdXAgRWFydGhxdWFrZSBSZXNwb25zZSBCdWxsZXRpbiINCmRhdGU6ICAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclZCAlQiwgJVknKWAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgdGhlbWU6IHJlYWRhYmxlDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogbm8NCiAgICBjb2xsYXBzZWQ6IG5vDQphbHdheXNfYWxsb3dfaHRtbDogeWVzDQotLS0NCg0KYGBge2NzcywgZWNobz1GQUxTRX0NCg0KI1RPQzo6YmVmb3JlIHsNCiAgY29udGVudDogIiI7DQogIGRpc3BsYXk6IGJsb2NrOw0KICBoZWlnaHQ6IDcwcHg7DQogIG1hcmdpbjogMmVtIDIwcHggNDBweCAyMHB4Ow0KICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIk5XUy1DV0cgbG9nby5QTkciKTsNCiAgYmFja2dyb3VuZC1zaXplOiBjb250YWluOw0KICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgY2VudGVyOw0KICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0Ow0KfQ0KYGBgDQoNCmBgYHs9aHRtbH0NCjxzdHlsZT4NCiAgICBib2R5IC5tYWluLWNvbnRhaW5lciB7DQogICAgICAgIG1heC13aWR0aDogMTI4MHB4Ow0KICAgIH0NCjwvc3R5bGU+DQpgYGANCg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UsIGZpZy53aWR0aD05LCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmc9RkFMU0UpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShsdWJyaWRhdGUpDQpsaWJyYXJ5KHN0cmluZ2kpDQpsaWJyYXJ5KHBhbmRlcikNCmxpYnJhcnkoamFuaXRvcikNCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KbGlicmFyeSh2aXJpZGlzKQ0KbGlicmFyeShza2ltcikNCmxpYnJhcnkocGF0Y2h3b3JrKQ0KbGlicmFyeShEVCkNCmxpYnJhcnkoaGVyZSkNCmxpYnJhcnkoc2YpDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkoZmxleHRhYmxlKQ0KbGlicmFyeShzbmFrZWNhc2UpDQpsaWJyYXJ5KGFyYWJpY1N0ZW1SKQ0KbGlicmFyeSh3cml0ZXhsKQ0KbGlicmFyeShtZGVwcml2KQ0KbGlicmFyeShnZ3JlcGVsKQ0KDQp0aGVtZV9zZXQodGhlbWVfbGlnaHQoKSkNCg0KIyBkaXNhYmxpbmcgc2NpZW50aWZpYyBub3RhdGlvbg0Kb3B0aW9ucyhzY2lwZW4gPSAxMDApDQoNCiMgcGFuZGVyIHRhYmxlcyBhbGwgaW4gb25lIHJvdw0KcGFuZGVyT3B0aW9ucygndGFibGUuc3BsaXQudGFibGUnLCBJbmYpDQoNCiMgcGFuZGVyIHRob3VzYW5kcyBzZXBhcmF0b3INCnBhbmRlck9wdGlvbnMoImJpZy5tYXJrIiwgIiwiKQ0KDQojIHJlcGxhY2UgDQpvcHRzIDwtIG9wdGlvbnMoa25pdHIua2FibGUuTkEgPSAiIikNCg0KYCVvdXQlYCA8LSBOZWdhdGUoYCVpbiVgKQ0KDQojIGZ1bmN0aW9uIGZvciB0cmFuc3Bvc2luZyBkZg0KdHJhbnNwb3NlX2RmIDwtIGZ1bmN0aW9uKGRmKSB7DQogIHRfZGYgPC0gZGF0YS50YWJsZTo6dHJhbnNwb3NlKGRmKQ0KICBjb2xuYW1lcyh0X2RmKSA8LSByb3duYW1lcyhkZikNCiAgcm93bmFtZXModF9kZikgPC0gY29sbmFtZXMoZGYpDQogIHRfZGYgPC0gdF9kZiAlPiUNCiAgICB0aWJibGU6OnJvd25hbWVzX3RvX2NvbHVtbiguZGF0YSA9IC4pICU+JQ0KICAgIHRpYmJsZTo6YXNfdGliYmxlKC4pDQogIHJldHVybih0X2RmKQ0KfQ0KDQojIGZ1bmN0aW9uIGJlbmVmaWNpYXJ5IHN1bW1hcmllcw0Kc3VtX2JlbiA8LSBmdW5jdGlvbihkZiwgY29sdW1uX3Zhcil7DQogIA0KICBjb2x1bW5fdmFyIDwtIGVucXVvKGNvbHVtbl92YXIpDQogIA0KICBkZiAlPiUNCiAgICBncm91cF9ieSghIWNvbHVtbl92YXIpICU+JSAjIG11c3QgYWRkIGJhbmctYmFuZw0KICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogICAgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJpZXMpKQ0KICAgIA0KfQ0KDQojIGZ1bmN0aW9uIGJlbmVmaWNpYXJ5IHN1bW1hcmllcywgMiBncm91cGVkIHZhcmlhYmxlcw0Kc3VtX2JlbjIgPC0gZnVuY3Rpb24oZGYsIGNvbHVtbl92YXIxLCBjb2x1bW5fdmFyMil7DQogIA0KICBjb2x1bW5fdmFyMSA8LSBlbnF1byhjb2x1bW5fdmFyMSkNCiAgY29sdW1uX3ZhcjIgPC0gZW5xdW8oY29sdW1uX3ZhcjIpDQogIA0KICBkZiAlPiUNCiAgICBncm91cF9ieSghIWNvbHVtbl92YXIxLCAhIWNvbHVtbl92YXIyKSAlPiUgIyBtdXN0IGFkZCBiYW5nLWJhbmcNCiAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShuZXdfYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKSwgLmdyb3VwcyA9ICJkcm9wIikNCiAgICANCn0NCg0KIyBzY2FsaW5nIGZ1bmN0aW9ucyANCnJhbmdlMDEgPC0gZnVuY3Rpb24oeCl7KHgtbWluKHgpKS8obWF4KHgpLW1pbih4KSl9DQpyYW5nZV93bmEgPC0gZnVuY3Rpb24oeCl7KHgtbWluKHgsIG5hLnJtID0gVFJVRSkpLyhtYXgoeCwgbmEucm0gPSBUUlVFKS1taW4oeCwgbmEucm0gPSBUUlVFKSl9DQoNCiNtb2RlIGZ1bmN0aW9uIA0KbW9kZSA8LSBmdW5jdGlvbih4KSB7DQogIHV4IDwtIHVuaXF1ZSh4KQ0KICB1eFt3aGljaC5tYXgodGFidWxhdGUobWF0Y2goeCwgdXgpKSldDQp9DQoNCmxvY2F0aW9ucyA8LSByZWFkX2V4Y2VsKCIuL2RhdGEvTG9jYXRpb25zLnhsc3giKSAlPiUgDQogIGNsZWFuX25hbWVzKCkNCg0KcGNvZGUzX3NoYXBlIDwtIA0KICBzdF9yZWFkKCIuL2RhdGEvc3lyX2FkbWJuZGFfdW5jc191bm9jaGFfMjAyMDEyMTcvc3lyX2FkbWJuZGFfYWRtM191bmNzX3Vub2NoYV8yMDIwMTIxNy5zaHAiKQ0KDQphcmFiaWNfbGFiZWxzIDwtIGZ1bmN0aW9uKHgpIHBhc3RlMCgiXHUyMDJiIiwgeCkNCg0KcmVwb3J0X2RhdGUgPC0gIjExIEFwcmlsIDIwMjMiDQpgYGANCg0KDQpgYGB7ciBkYXRhfQ0KbmFtZXNfZXEgPC0gYygNCiAgImRhdGUiLA0KICAiZ292ZXJub3JhdGUiLA0KICAiZGlzdHJpY3QiLA0KICAic3ViX2Rpc3RyaWN0IiwNCiAgImNvbW11bml0eSIsDQogICJhZG1pbjQiLA0KICAiY2FzdWFsdGllcyIsDQogICJpbmp1cmllcyIsDQogICJjb21wbGV0ZWx5X2Rlc3Ryb3llZF9ob3VzZXMiLA0KICAiZGFtYWdlZF91bmloYWJpdGFibGVfaG91c2VzIiwNCiAgInRlbXBvcmFyeV9hY2NvbW1vZGF0aW9uX2NlbnRyZXMiLA0KICAiaWRwc19pbl9hbGxfY2VudHJlcyIsDQogICJzY2hvb2xzX2FzX2FjY29tb2RhdGlvbl9jZW50cmVzIiwNCiAgImlkcHNfaW5fc2Nob29scyIsDQogICJ0ZW50c19uZWVkZWQiLA0KICAiYmxhbmtldHNfbWF0dHJlc3Nlc19uZWVkZWQiLA0KICAidGVtcG9yYXJ5X2FjY29tbW9kYXRpb25fY2VudHJlc19hdmFpbGFibGUiLCANCiAgImFjY2Vzc2libGVfY2l2aWxfZGVmZW5zZSIsDQogICJsYXRyaW5lc19hdmFpbGFibGUiLA0KICAibWVhbHNfbmVlZGVkX3Blcl9kYXkiLA0KICAibmVlZF9ibG9vZF9kb25hdGlvbnMiLA0KICAiaGVhbHRoX3NlcnZpY2VzX2F2YWlsYWJsZSIsDQogICJuZWNlc3NhcnlfbWVkaWNhbF9lcXVpcG1lbnQiLA0KICAicnViYmxlX3ZvbHVudGVlcnMiLA0KICAidGVsZWNvbXNfYXZhaWxhYmxlIiwNCiAgImVsZWN0cmljaXR5X2F2YWlsYWJsZSIsIA0KICAiaGVhdGluZ19mdWVsX25lZWRlZCINCikNCg0KZXEgPC0gcmVhZF9leGNlbCgiLi9kYXRhL3N5cmlhLWVhcnRocXVha2UtaW1wYWN0LTIwLW1hcmNoLTIwMjMueGxzeCIsDQogICAgICAgICAgICAgICAgIHNoZWV0ID0gIkRBVEFTRVQiKSAlPiUgDQogIHNldE5hbWVzKG5hbWVzX2VxKSAlPiUgDQogIGxlZnRfam9pbihsb2NhdGlvbnMgJT4lIHNlbGVjdChhZG1pbjRwY29kZSwgYWRtaW4zcGNvZGUpLCANCiAgICAgICAgICAgIGJ5ID0gYygiYWRtaW40IiA9ICJhZG1pbjRwY29kZSIpKSAlPiUgDQogIG11dGF0ZSh3b3VuZGVkX2RlYWQgPSBjYXN1YWx0aWVzICsgaW5qdXJpZXMsDQogICAgICAgICAgICAgZGFtYWdlZF9ob3VzZXMgPSBjb21wbGV0ZWx5X2Rlc3Ryb3llZF9ob3VzZXMgKyBkYW1hZ2VkX3VuaWhhYml0YWJsZV9ob3VzZXMpICU+JSANCiAgICAgIGdyb3VwX2J5KGFkbWluM3Bjb2RlKSAlPiUgDQogICAgICBzdW1tYXJpc2Uod291bmRlZF9kZWFkID0gc3VtKHdvdW5kZWRfZGVhZCwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICAgICAgZGFtYWdlZF9ob3VzZXMgPSBzdW0oZGFtYWdlZF9ob3VzZXMsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgbGVmdF9qb2luKHJlYWRfZXhjZWwoIi4vZGF0YS8yMDIzSE5PX1BpTl9TZXZlcml0eV9kZXRhaWxlZEFvSV9GT1JTSEFSRSAxNTAzMjAyMy54bHN4Iiwgc2tpcCA9IDEsIA0KICAgICAgICAgICAgICAgICAgc2hlZXQgPSAxKSAlPiUNCiAgICAgICAgICAgICAgY2xlYW5fbmFtZXMoKSAlPiUNCiAgICAgICAgICAgICAgc2VsZWN0KGFkbWluM3Bjb2RlLCB0b3RhbF9wb3B1bGF0aW9uKSwgDQogICAgICAgICAgICBieSA9ICJhZG1pbjNwY29kZSIpICU+JSANCiAgbXV0YXRlKHdvdW5kZWRfZGVhZF8xMDBrID0gd291bmRlZF9kZWFkIC8gdG90YWxfcG9wdWxhdGlvbiAqIDEwMDAwMCwgDQogICAgICAgICBkYW1hZ2VkX2hvdXNlc18xMDBrID0gZGFtYWdlZF9ob3VzZXMgLyB0b3RhbF9wb3B1bGF0aW9uICogMTAwMDAwKQ0KDQoNCmVxX21kZXByaXYgPC0gZXEgJT4lDQogIG11dGF0ZV9hdCh2YXJzKHdvdW5kZWRfZGVhZCwgZGFtYWdlZF9ob3VzZXMsIA0KICAgICAgICAgICAgICAgICB3b3VuZGVkX2RlYWRfMTAwaywgZGFtYWdlZF9ob3VzZXNfMTAwayksIH4gcmFuZ2Vfd25hKC4pKSAlPiUgDQogIG1kZXByaXYoYygid291bmRlZF9kZWFkIiwgImRhbWFnZWRfaG91c2VzIiwgDQogICAgICAgICAgICAid291bmRlZF9kZWFkXzEwMGsiLCAiZGFtYWdlZF9ob3VzZXNfMTAwayIpLCANCiAgICAgICAgICBtZXRob2QgPSAiY3oiLCBvdXRwdXQgPSAiYWxsIiwgDQogICAgICAgICAgc2NvcmVfaV9oZWFkaW5nID0gImVxX3Njb3JlIikNCg0KZXEgPC0gZXEgJT4lIA0KICBsZWZ0X2pvaW4oZXFfbWRlcHJpdiRkYXRhICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFkbWluM3Bjb2RlLCBlcV9zY29yZSksIA0KICAgICAgICAgICAgYnkgPSAiYWRtaW4zcGNvZGUiKQ0KDQojIFRoaW5rIG9mIGFub3RoZXIgd2F5IHRvIGRvIHRoaXMgLS0gaWYgc29tZW9uZSBlbHNlIHJ1bnMgdGhpcywgaXQgd29uJ3Qgd29yayANCmNiciA8LSByZWFkX2NzdigiLi9kYXRhL2Nicl9jb20uY3N2IikgJT4lIA0KICBtdXRhdGUobW9udGggPSBtb250aChkaXN0cmlidXRpb25fZGF0ZSkpICU+JSANCiAgcmVwbGFjZV9uYShsaXN0KGJlbmVmaWNpYXJpZXMgPSAwKSkgDQogIA0KDQpobm8gPC0gcmVhZF9leGNlbCgiLi9kYXRhLzIwMjNITk9fUGlOX1NldmVyaXR5X2RldGFpbGVkQW9JX0ZPUlNIQVJFIDE1MDMyMDIzLnhsc3giLCBza2lwID0gMSwgDQogICAgICAgICAgICAgICAgICBzaGVldCA9IDEpICU+JQ0KICBjbGVhbl9uYW1lcygpDQoNCg0KbndfcGNvZGUzIDwtIGhubyAlPiUgDQogIGZpbHRlcihhb19jID09ICJOVyIpICU+JSANCiAgcHVsbChhZG1pbjNwY29kZSkNCg0KZm91ciA8LSByZWFkX2NzdigiLi9kYXRhLzR3cy5jc3YiKQ0KDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCiMgMS4gTVBDIHJlc3BvbnNlIG92ZXJ2aWV3DQoNCkFzIG9mIDExIEFwcmlsIDIwMjMsIGEgdG90YWwgb2YgYHIgY2JyICU+JSBmaWx0ZXIocHJvamVjdF9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kYmVuZWZpY2lhcmllcyl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBwZXJzb25zIG9yIGByIGNiciAlPiUgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGZhbWlsaWVzLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgZmFtaWxpZXMgaGF2ZSBiZWVuIHJlYWNoZWQgYnkgTVBDIGludGVydmVudGlvbnMuIA0KQSB0b3RhbCBvZiBVU0QgYHIgcGFzdGUoZm9ybWF0KHJvdW5kKChjYnIgJT4lIGZpbHRlcihwcm9qZWN0X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lICB7c3VtKC4kdG90YWxfdXNkKX0pIC8gMTAwMDAwMCwgMSksIHRyaW0gPSBUUlVFKSwgIm1pbGxpb24iKWAgaGFzIGJlZW4gZGlzYnVyc2VkIGJ5IGByIGNiciAlPiUgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUgc3VtbWFyaXNlKG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXIpKSAlPiUgcHVsbCgpYCBpbXBsZW1lbnRpbmcgYWdlbmNpZXMgYWNyb3NzIGByIGNiciAlPiUgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUgc3VtbWFyaXNlKG5fZGlzdGluY3QoYWRtaW4zcGNvZGUpKSAlPiUgcHVsbCgpYCBzdWItZGlzdHJpY3RzLiANCg0KV2l0aCBvbmx5IGNlcnRhaW4gZXhjZXB0aW9ucyAoc3VjaCBhcyBhY3Rpdml0aWVzIHNwZWNpZmllZCBhcyBub24tTVBDIGNhc2gtZm9yLWZvb2QpLCBvbmx5IGJlbmVmaWNpYXJpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgYXQgbGVhc3QgVVNEIDEwMC9mYW1pbHkvbW9udGggaGF2ZSBiZWVuIGluY2x1ZGVkLg0KDQo8YnI+DQoNCmBgYHtyIHN1bW1hcnkgdGFibGV9DQpjYnIgJT4lIA0KICBmaWx0ZXIocHJvamVjdF9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JQ0KICBncm91cF9ieShnb3Zlcm5vcmF0ZSwgZGlzdHJpY3QpICU+JSANCiAgc3VtbWFyaXNlKHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lciksIA0KICAgICAgICAgICAgY29tbXVuaXRpZXMgPSBuX2Rpc3RpbmN0KGFkbWluNHBjb2RlKSwgDQogICAgICAgICAgICBob3VzZWhvbGRzID0gc3VtKGZhbWlsaWVzLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICB0b3RhbF91c2QgPSBzdW0odG90YWxfdXNkLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIG11dGF0ZShgJV9iZW5lZmljaWFyaWVzYCA9IA0KICAgICAgICAgICByb3VuZChiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSkgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUNCiAgYWRvcm5fdG90YWxzKCJyb3ciLCwsLCBob3VzZWhvbGRzLCBiZW5lZmljaWFyaWVzLCB0b3RhbF91c2QsIGAlX2JlbmVmaWNpYXJpZXNgKSAlPiUgDQogIG11dGF0ZShgJV9iZW5lZmljaWFyaWVzYCA9IGlmZWxzZShgJV9iZW5lZmljaWFyaWVzYCA+IDk5Ljk4LCAxMDAsIGAlX2JlbmVmaWNpYXJpZXNgKSkgJT4lIA0KICBzZWxlY3QoZ292ZXJub3JhdGUsIGRpc3RyaWN0LCBjb21tdW5pdGllcywgcGFydG5lcnMsIA0KICAgICAgICAgaG91c2Vob2xkcywgYmVuZWZpY2lhcmllcywgdG90YWxfdXNkLCBgJV9iZW5lZmljaWFyaWVzYCkgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHNldF9jYXB0aW9uKHBhc3RlMCgiNDQ4LDAwMCBwZW9wbGUgcmVhY2hlZCB3aXRoIE1QQywgVVNEIDEzLjMgbWlsbGlvbiBkaXNidXJzZWQsICIsIHJlcG9ydF9kYXRlKSkgJT4lIA0KICB0aGVtZV96ZWJyYSgpICU+JSANCiMgIGZvb3Rub3RlKGkgPSAxLCBqID0gNiwgcGFydCA9ICJoZWFkZXIiLCByZWZfc3ltYm9scyA9ICJhIiwNCiMgICAgICAgICAgIGFzX3BhcmFncmFwaCgiQmVuZWZpY2lhcnkgZmlndXJlcyBpbmNsdWRlIG9ubHkgcmVwb3J0ZWQgTVBDIHdpdGggYSBtaW5pbXVtIHRyYW5zZmVyIHZhbHVlICNvZiBVU0QgMTAwIikpICU+JSANCiAgZm9vdG5vdGUoaSA9IDEsIGogPSA4LCBwYXJ0ID0gImhlYWRlciIsIHJlZl9zeW1ib2xzID0gImIiLCBpbmxpbmUgPSBUUlVFLCAgDQogICAgICAgICAgIGFzX3BhcmFncmFwaCgiQXMgcGVyY2VudGFnZSBvZiBhbGwgTVBDIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBpbiBOVyBTeXJpYSIpKSANCg0KDQpgYGANCg0KDQpgYGB7ciBldmFsID0gRkFMU0V9DQoNCiMgSnVzdCBicmVha2Rvd24gYnkgbW9udGggLS0gZG9uJ3Qga25vdyB3aHkgSSBkaWQgYSBsaW5lIHBsb3QgaW5zdGVhZCBvZiBhIGJhcnBsb3QsIA0KIyBtYXliZSBiYXJwbG90IHdoZW4gdGhlcmUgYXJlIG1vcmUgbW9udGhzIA0KDQpjYnIgJT4lIA0KICBtdXRhdGUobW9udGggPSBtb250aChkaXN0cmlidXRpb25fZGF0ZSkpICU+JSANCiAgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUgDQogIA0KICBncm91cF9ieShtb250aCkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpKQ0KDQpjYnIgJT4lIGNvdW50KGltcGxlbWVudGluZ19wYXJ0bmVyLCBwYXJ0bmVyX2NvZGUpDQoNCmBmaWx0ZXIoY2JyLCBtb250aCA9PSAyICYgcHJvamVjdF9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgDQoNCmBgYA0KDQo8YnI+DQoNCmByIGZpbHRlcihjYnIsIG1vbnRoID09IDIgJiBwcm9qZWN0X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiRiZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgYmVuZWZpY2lhcmllcyB3ZXJlIHJlYWNoZWQgaW4gRmVicnVhcnkgMjAyMyBhbmQgYHIgZmlsdGVyKGNiciwgbW9udGggPT0gMyAmIHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGJlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIHJlYWNoZWQgaW4gTWFyY2ggMjAyMy4gYHIgZmlsdGVyKGNiciwgbW9udGggPT0gNCAmIHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGJlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBoYXZlIGJlZW4gcmVhY2hlZCBzbyBmYXIgaW4gQXByaWwgMjAyMy5DaGFuZ2VzIGluIG51bWJlcnMgb2YgcGVyc29ucyByZWFjaGVkIHdlcmUgZHVlIHRvIGNsZWFuaW5nIGFuZCB2ZXJpZmljYXRpb24gb2YgdGhlIGRhdGFzZXQgLS0gdGhpcyBwcm9jZXNzIGlzIHN0aWxsIG9uZ29pbmcgYW5kIHdpbGwgb25seSBiZSBjb21wbGV0ZWQgb25jZSB0aGUgQ1dHIGZ1bGx5IHRyYW5zaXRpb25zIHRvIDRXIHJlcG9ydGluZy4gDQoNCiAgDQogIA0KDQpgYGB7ciBldmFsPUZBTFNFfQ0KY2JyICU+JSANCiAgbXV0YXRlKGRpc3RyaWJ1dGlvbl9kYXRlID0gYXMuRGF0ZShkaXN0cmlidXRpb25fZGF0ZSkpICU+JSANCiAgZmlsdGVyKGRpc3RyaWJ1dGlvbl9kYXRlID09ICIwMDIyLTAxLTIwIikgJT4lIA0KICB7c3VtKC4kYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKX0NCmBgYA0KDQo8YnI+PGJyPg0KDQojIyAxLjEgUHJvZ3Jlc3MgYnkgZGF0ZQ0KDQpgYGB7ciBmaWcuaGVpZ2h0PTZ9DQpjYnIgJT4lDQogIG11dGF0ZShkaXN0cmlidXRpb25fZGF0ZSA9IGFzLkRhdGUoZGlzdHJpYnV0aW9uX2RhdGUpKSAlPiUgDQogIGZpbHRlcighaXMubmEoZGlzdHJpYnV0aW9uX2RhdGUpKSAlPiUgDQogIGZpbHRlcihwcm9qZWN0X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICBncm91cF9ieShkaXN0cmlidXRpb25fZGF0ZSkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSkgJT4lDQogIGFycmFuZ2UoZGlzdHJpYnV0aW9uX2RhdGUpICU+JSANCiAgZmlsdGVyKGRpc3RyaWJ1dGlvbl9kYXRlICE9ICIwMDIyLTAxLTIwIikgJT4lIA0KICBtdXRhdGUoaWZlbHNlKGRpc3RyaWJ1dGlvbl9kYXRlID4gIjIwMjMtMDQtMTEiLCAiMjAyMy0wNC0xMSIsIGRpc3RyaWJ1dGlvbl9kYXRlKSkgJT4lIA0KICBtdXRhdGUoY3VtX2JlbiA9IGN1bXN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBtdXRhdGUoY3VtX2xhYmVsID0gaWZlbHNlKGRpc3RyaWJ1dGlvbl9kYXRlID09ICIyMDIzLTAyLTA5IiB8IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9uX2RhdGUgPT0gIjIwMjMtMDMtMDIiIHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBkaXN0cmlidXRpb25fZGF0ZSA9PSAiMjAyMy0wMy0yMiIgfA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9uX2RhdGUgPT0gIjIwMjMtMDMtMzAifA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9uX2RhdGUgPT0gIjIwMjMtMDQtMTUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdW1fYmVuLCAiIiksIA0KICAgICAgICAgY3VtX2xhYmVsID0gYXMubnVtZXJpYyhjdW1fbGFiZWwpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gZGlzdHJpYnV0aW9uX2RhdGUsIHkgPSBjdW1fYmVuKSkgKyANCiAgZ2VvbV9saW5lKGNvbG91ciA9ICJibHVlIikgKyANCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHNjYWxlczo6Y29tbWEoY3VtX2xhYmVsKSksIHZqdXN0ID0gLS42LCANCiAgICAgICAgICAgIHNpemUgPSA0KSArIA0KICBzY2FsZV94X2RhdGUoZGF0ZV9icmVha3MgPSAiMSB3ZWVrIiwgZGF0ZV9sYWJlbHMgPSAiJWQtJWIiKSArDQogICMgV2h5IGRpZG4ndCB5b3UgbGVhcm4gdGhpcyBiZWZvcmU/IA0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEsIGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gLjEpKSArIA0KICBsYWJzKHggPSAiRGlzdHJpYnV0aW9uIGRhdGUiLCANCiAgICAgICB5ID0gIkN1bXVsYXRpdmUgYmVuZWZpY2lhcmllcyIsIA0KICAgICAgIHRpdGxlID0gIk1QQyBwcm9ncmVzcyBieSBkYXRlIiwgDQogICAgICAgc3VidGl0bGUgPSAiVGhlIGVhcmxpZXN0IGVhcnRocXVha2UtcmVsYXRlZCBkaXN0cmlidXRpb24gd2FzIDIwMjMtMDItMDlcbkV4Y2x1ZGVzIDE2LDQ2MCBiZW5lZmljaWFyaWVzIGZvciB3aGljaCB0aGUgZGF0ZSB3YXMgbm90IHJlcG9ydGVkIG9yIHdhcyB1bnJlYWRhYmxlIikgIA0KICANCiMgZ2dzYXZlKCIuL2ltZy9wcm9ncmVzc19saW5lLnBuZyIsIGRwaSA9IDMwMCwgaGVpZ2h0ID0gOC4yNywgd2lkdGggPSAxMS42OSwgdW5pdHMgPSAiaW4iKSAgDQpgYGANCg0KPGJyPg0KDQpUaGUgc21hbGwgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBlYXJsaWVyIHRoYW4gRmVicnVhcnkgYWxsIHBlcnRhaW5lZCB0byB0aGUgSFJQLCB0aGUgb25seSBzdWNoIGJlbmVmaWNpYXJpZXMgcmVwb3J0ZWQgc28gZmFyLiBJdCBpcyB1bmNsZWFyIGlmIHRoaXMgaXMgdGhlIGV4dGVudCBvZiBhbGwgSmFudWFyeSBhY2hpZXZlbWVudHMuIA0KDQo8YnI+PGJyPg0KDQojIDIuIE1hcCBvZiBhY3Rpdml0aWVzDQoNCjxicj4NCg0KYGBge3IgZmlnLmhlaWdodD03fQ0KDQpwbGFubmVkX2ltcGxlbWVudGVkX21hcCA8LSBjYnIgJT4lIA0KICByaWdodF9qb2luKHBjb2RlM19zaGFwZSwgDQogICAgICAgICAgICAgYnkgPSBjKCJhZG1pbjNwY29kZSIgPSAiQURNM19QQ09ERSIpKSAlPiUgDQogIGZpbHRlcihBRE0xX1BDT0RFICVpbiUgYygiU1kwMiIsICJTWTA3IikgJiAhaXMubmEoYmVuZWZpY2lhcmllcykpICU+JSANCiAgc3RfYXNfc2YoKSAlPiUNCiAgZ2dwbG90KCkgKyANCiAgZ2VvbV9zZihzaXplID0gLjEsIGNvbG91ciA9ICJncmV5NzAiKSArIA0KICBnZW9tX3BvaW50KGFlcyhzaXplID0gYmVuZWZpY2lhcmllcywNCiAgICAgICAgICAgICAgICAgY29sb3VyID0gcHJvamVjdF9zdGF0dXMsIA0KICAgICAgICAgICAgICAgICB4ID0gbG9uZ2l0dWRlX3gsIHkgPSBsYXRpdHVkZV95LCANCiAgICAgICAgICAgICAgICAgdGV4dCA9IHBhc3RlMCgic3ViX2Rpc3RyaWN0OiAiLCBzdWJfZGlzdHJpY3QsICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbW11bml0eTogIiwgY29tbXVuaXR5LCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2NhdGlvbl90eXBlOiAiLCB2aWxsYWdlX2NhbXBzLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZW5lZmljaWFyaWVzOiIsIGZvcm1hdChiZW5lZmljaWFyaWVzLCBiaWcubWFyayA9ICIsIiksICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcnRuZXI6ICIsIGFiYnJldmlhdGlvbiwgIlxuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvbl94OiAiLCBsb25naXR1ZGVfeCwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGF0X3k6ICIsIGxhdGl0dWRlX3kpKSwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMSwgc3Ryb2tlID0gLjM1LCANCiAgICAgICAgICAgICBhbHBoYSA9IC41KSArIA0KICBzY2FsZV9zaXplX2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsgDQogIHNjYWxlX2NvbG91cl92aXJpZGlzX2QobmEudHJhbnNsYXRlID0gRkFMU0UpICsgDQogIHRoZW1lX3ZvaWQoKSArIA0KICB0aGVtZShwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG91ciA9IE5BKSwgDQogICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSksKSArDQogIGxhYnModGl0bGUgPSAiQ29tbXVuaXRpZXMgcmVhY2hlZCBhbmQgcGxhbm5lZCAtLSBDV0cgcGFydG5lcnMiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJQbGFubmVkIGluIHllbGxvdywgY29tcGxldGVkIGluIHB1cnBsZSwgc2l6ZSBzaG93cyBudW1iZXIgb2YgcGVyc29ucyIsIA0KICAgICAgIGNvbG91ciA9ICJTdGF0dXMiKSArDQogIGd1aWRlcyhzaXplID0gIm5vbmUiKQ0KDQogIA0KZ2dwbG90bHkocGxhbm5lZF9pbXBsZW1lbnRlZF9tYXAsIHRvb2x0aXAgPSBjKCJ0ZXh0IikpICU+JSANCiAgcGxvdGx5OjpzdHlsZShob3Zlcm9uID0gInBvaW50IikgJT4lIA0KICBsYXlvdXQodGl0bGUgPSBsaXN0KHRleHQgPSBwYXN0ZTAoIkNvbW11bml0aWVzIHJlYWNoZWQgYW5kIHBsYW5uZWQgLS0gQ1dHIHBhcnRuZXJzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxzdXA+IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGxhbm5lZCBpbiB5ZWxsb3csIGNvbXBsZXRlZCBpbiBwdXJwbGUsIHNpemUgc2hvd3MgbnVtYmVyIG9mIHBlcnNvbnM7IGNsaWNrIGFuZCBkcmFnIHRvIHpvb207IG1vdXNlIG92ZXIgZm9yIGRldGFpbHMiKSkpDQogIA0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQojIDMuIEdlb2dyYXBoaWMgYnJlYWtkb3duIG9mIGJlbmVmaWNpYXJpZXMgDQoNCkNvdmVyYWdlIGNvbnRpbnVlcyB0byBiZSBoaWdoZXN0IGluIEFmcmluIGFuZCBIYXJpbSBkaXN0cmljdHMsIHdoaWNoIGhhdmUgYmVlbiB3b3JzdC1oaXQgYnkgdGhlIGVhcnRocXVha2UuIA0KDQo8YnI+DQoNCmBgYHtyfQ0KY2JyICU+JSANCiAgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUgDQogIGdyb3VwX2J5KGdvdmVybm9yYXRlLCBkaXN0cmljdCkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIG11dGF0ZShkaXN0cmljdCA9IGZjdF9yZW9yZGVyKGRpc3RyaWN0LCBiZW5lZmljaWFyaWVzKSwgDQogICAgICAgICBnb3Zlcm5vcmF0ZSA9IGZjdF9yZWxldmVsKGdvdmVybm9yYXRlLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiSWRsZWIiLCAiQWxlcHBvIikpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGJlbmVmaWNpYXJpZXMsIHkgPSBkaXN0cmljdCkpICsgDQogIGdlb21fY29sKGFlcyhmaWxsID0gZ292ZXJub3JhdGUpKSArIA0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEoYmVuZWZpY2lhcmllcykpLCANCiAgICAgICAgICAgIGhqdXN0ID0gImlud2FyZCIpICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKGJlZ2luID0gLjMpICsgDQogIGxhYnModGl0bGUgPSAiTVBDIGJlbmVmaWNpYXJpZXMgYnkgZGlzdHJpY3QiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJhcyBvZiAxMSBBcHJpbCAyMDIzIiwgDQogICAgICAgeSA9ICIiKSArIA0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsgDQoNCmhubyAlPiUgDQogIGZpbHRlcihhZG1pbjJuYW1lX2VuICVpbiUgYygiSGFyaW0iLCAiSWRsZWIiLCAiSmlzci1Bc2gtU2h1Z3VyIiwgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFmcmluIiwgIkplYmVsIFNhbWFuIiwgIkEnemF6IiwgIkphcmFibHVzIiwgIkFsIEJhYiIpKSAlPiUgDQogIGdyb3VwX2J5KGdvdmVybm9yYXRlID0gYWRtaW4xbmFtZV9lbiwgZGlzdHJpY3QgPSBhZG1pbjJuYW1lX2VuKSAlPiUgDQogIHN1bW1hcmlzZSh0b3RhbF9wb3B1bGF0aW9uID0gc3VtKHRvdGFsX3BvcHVsYXRpb24sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgLmdyb3VwcyA9ICJkcm9wIikgJT4lIA0KICBsZWZ0X2pvaW4oDQogICAgY2JyICU+JQ0KICAgICAgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUgIA0KICAgICAgZ3JvdXBfYnkoZGlzdHJpY3QpICU+JSANCiAgICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSkpICwgIA0KICBieSA9ICJkaXN0cmljdCIpICU+JSANCiAgbXV0YXRlKGRpc3RyaWN0ID0gZmN0X3JlbGV2ZWwoZGlzdHJpY3QsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWwgQmFiIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKYXJhYmx1cyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQSd6YXoiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkplYmVsIFNhbWFuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBZnJpbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSmlzci1Bc2gtU2h1Z3VyIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJZGxlYiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGFyaW0iKSwNCiAgICAgICAgIHBjX3JlYWNoZWQgPSByb3VuZChiZW5lZmljaWFyaWVzIC8gdG90YWxfcG9wdWxhdGlvbiAqIDEwMCwgZGlnaXRzID0gMSkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gcGNfcmVhY2hlZCwgeSA9IGRpc3RyaWN0KSkgKw0KICBnZW9tX2NvbChhZXMoZmlsbCA9IGdvdmVybm9yYXRlKSkgKyANCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKHBjX3JlYWNoZWQpKSwgDQogICAgICAgICAgICBoanVzdCA9ICJpbndhcmQiKSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKGJlZ2luID0gLjMpICsgDQogIGxhYnModGl0bGUgPSAiUGVyY2VudCBvZiBwb3B1bGF0aW9uIHJlYWNoZWQiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJhcyBvZiAxMSBBcHJpbCAyMDIzIiwgDQogICAgICAgeSA9ICIiLCANCiAgICAgICB4ID0gIiUgb2YgcG9wdWxhdGlvbiByZWFjaGVkIikgKw0KICANCiAgcGxvdF9sYXlvdXQoZ3VpZGVzID0gImNvbGxlY3QiKSAmIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikNCg0KZ2dzYXZlKCIuL2ltZy9tcGNfYnlfZGlzdHJpY3QucG5nIiwgZHBpID0gMzAwLCBoZWlnaHQgPSA4LjI3LCB3aWR0aCA9IDExLjY5LCB1bml0cyA9ICJpbiIpICANCg0KYGBgDQoNCjxicj4NCg0KYGBge3J9DQplcSAlPiUgDQogIGxlZnRfam9pbihobm8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoZ292ZXJub3JhdGUgPSBhZG1pbjFuYW1lX2VuLCANCiAgICAgICAgICAgICAgICAgICAgIGRpc3RyaWN0ID0gYWRtaW4ybmFtZV9lbiwgDQogICAgICAgICAgICAgICAgICAgICBzdWJfZGlzdHJpY3QgPSBhZG1pbjNuYW1lX2VuLCANCiAgICAgICAgICAgICAgICAgICAgIGFkbWluM3Bjb2RlKSwgDQogICAgICAgICAgICBieSA9ICJhZG1pbjNwY29kZSIpICU+JSANCiAgZmlsdGVyKGFkbWluM3Bjb2RlICVpbiUgbndfcGNvZGUzICYgDQogICAgICAgICAgIGRpc3RyaWN0ICVpbiUgYygiSGFyaW0iLCAiSWRsZWIiLCAiSmlzci1Bc2gtU2h1Z3VyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBZnJpbiIsICJKZWJlbCBTYW1hbiIsICJBJ3pheiIsICJKYXJhYmx1cyIsICJBbCBCYWIiKSkgJT4lIA0KICBncm91cF9ieShnb3Zlcm5vcmF0ZSwgZGlzdHJpY3QpICU+JSANCiAgc3VtbWFyaXNlKHdvdW5kZWRfZGVhZCA9IHN1bSh3b3VuZGVkX2RlYWQsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgZGFtYWdlZF9ob3VzZXMgPSBzdW0oZGFtYWdlZF9ob3VzZXMsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgIyBXaGVyZSBpcyBBcmloYSwgYW5kIHdoeSBpcyBpdCBzaG93aW5nIHVwIGhlcmUNCiAgZmlsdGVyKGRpc3RyaWN0ICE9ICJBcmloYSIpICU+JSANCiAgbGVmdF9qb2luKGhubyAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcihhZG1pbjNwY29kZSAlaW4lIG53X3Bjb2RlMyAmDQogICAgICAgICAgICAgICAgICAgICAgIGFkbWluMm5hbWVfZW4gJWluJSBjKCJIYXJpbSIsICJJZGxlYiIsICJKaXNyLUFzaC1TaHVndXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFmcmluIiwgIkplYmVsIFNhbWFuIiwgIkEnemF6IiwgIkphcmFibHVzIiwgIkFsIEJhYiIpKSAlPiUNCiAgICAgICAgICAgICAgZ3JvdXBfYnkoZGlzdHJpY3QgPSBhZG1pbjJuYW1lX2VuKSAlPiUNCiAgICAgICAgICAgICAgc3VtbWFyaXNlKHBvcHVsYXRpb24gPSBzdW0odG90YWxfcG9wdWxhdGlvbiwgbmEucm0gPSBUUlVFKSksIGJ5ID0gImRpc3RyaWN0IikgJT4lIA0KICBtdXRhdGUod291bmRlZF9kZWFkXzEwMGsgPSByb3VuZCh3b3VuZGVkX2RlYWQgLyBwb3B1bGF0aW9uICogMTAwMDAwLCBkaWdpdHMgPSAyKSwgDQogICAgICAgICBkYW1hZ2VkX2hvdXNlc18xMDBrID0gcm91bmQoZGFtYWdlZF9ob3VzZXMgLyBwb3B1bGF0aW9uICogMTAwMDAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBzZWxlY3QoZ292ZXJub3JhdGUsIGRpc3RyaWN0LCB3b3VuZGVkX2RlYWQsIHdvdW5kZWRfZGVhZF8xMDBrLCANCiAgICAgICAgIGRhbWFnZWRfaG91c2VzLCBkYW1hZ2VkX2hvdXNlc18xMDBrKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgdGhlbWVfemVicmEoKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuOTkpICU+JSANCiAgc2V0X2NhcHRpb24oIkNhc3VhbHRpZXMgYW5kIGRhbWFnZWQgaG91c2VzLCBhYnNvbHV0ZSBmaWd1cmVzIGFuZCBwZXIgMTAwLDAwMCBwZXJzb25zIikgJT4lIA0KICBmb290bm90ZShwYXJ0ID0gImhlYWRlciIsIGkgPSAxLCBqID0gMzo2LCBpbmxpbmUgPSBUUlVFLCByZWZfc3ltYm9scyA9ICIxIiwNCiAgICAgICAgICAgdmFsdWUgPSBhc19wYXJhZ3JhcGgoIkRhdGEgZnJvbSB0aGUgQXNzaXN0YW5jZSBDb29yZGluYXRpb24gVW5pdCwgU3lyaWEgMjAyMzAzMjgiKSkNCmBgYA0KDQo8YnI+DQoNCkJlbG93IGlzIGEgYnJlYWtkb3duIG9mIGJlbmVmaWNpYXJpZXMgYmFzZWQgb24gd2hldGhlciB0aGV5IG9yaWdpbmF0ZSBmcm9tIGNhbXBzIG9yIHZpbGxhZ2VzOiANCg0KPGJyPg0KDQpgYGB7cn0NCmNiciAlPiUgDQogIGZpbHRlcihwcm9qZWN0X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICBncm91cF9ieSh2aWxsYWdlX2NhbXBzKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIHJlcGxhY2VfbmEobGlzdCh2aWxsYWdlX2NhbXBzID0gIk5BIikpICU+JSANCiAgbXV0YXRlKGAlX2JlbmVmaWNpYXJpZXNgID0gcm91bmQoYmVuZWZpY2lhcmllcyAvIHN1bShiZW5lZmljaWFyaWVzKSAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICBzZXRfY2FwdGlvbigiTW9yZSB0aGFuIHR3aWNlIGFzIG1hbnkgYmVuZWZpY2lhcmllcyBmcm9tIHZpbGxhZ2VzIGFzIGZyb20gY2FtcHMiKSAlPiUgDQogIHRoZW1lX3plYnJhKCkgJT4lDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuNikNCiAgDQpgYGANCg0KDQo8YnI+PGJyPjxicj4NCg0KIyMjIDMuMSBCeSBzdWItZGlzdHJpY3QNCg0KVGhlIHBsb3RzIGJlbG93IHNob3cgdGhlIGJyZWFrZG93biBvZiBiZW5lZmljaWFyaWVzIGJ5IHN1Yi1kaXN0cmljdC4gQ2F1dGlvbiBtdXN0IGJlIHRha2VuIHRvIGVuc3VyZSB0aGF0IGFsbG9jYXRpb25zIGFyZSBmYWlyIGFjcm9zcyB0aGUgYWZmZWN0ZWQgYXJlYXM6IHRoZXJlIGFyZSBudW1lcm91cyBzdWItZGlzdHJpY3RzIHdoZXJlIGEgdmVyeSBsYXJnZSBwcm9wb3J0aW9uIG9mIHRoZSB0b3RhbCBwb3B1bGF0aW9uIGhhcyBhbHJlYWR5IGJlZW4gcmVhY2hlZCBieSBtdWx0aS1wdXJwb3NlIGNhc2gsIGluIHBhcnRpY3VsYXIsIEphbmRhaXJpcywgSGFpcm0sIFNhbHFpbiBhbmQgU2hhcmFuLiANCg0KUmVzcG9uc2UgYWN0aXZpdGllcyBtdXN0IGJlIHByb3BvcnRpb25hbCB3aXRoIHRoZSBtYWduaXR1ZGUgYW5kIHNldmVyaXR5IG9mIGVhcnRocXVha2UgZGFtYWdlLiBPdmVyYWxsb2NhdGlvbiBkZXByaXZlcyBhZmZlY3RlZCBwZXJzb25zIG9mIHRoZSBhaWQgdGhleSBhcmUgZHVlLiANCg0KVGhlIGF2ZXJhZ2UgcGVyY2VudGFnZSBvZiB0aGUgcG9wdWxhdGlvbiByZWFjaGVkLCBvZiBhbGwgc3ViLWRpc3RyaWN0cywgaXMgMTAuNjMlLiANCg0KPGJyPg0KDQpgYGB7ciBmaWcuaGVpZ2h0PTh9DQpjYnIgJT4lIA0KICBmaWx0ZXIocHJvamVjdF9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSANCiAgbXV0YXRlKHN1Yl9kaXN0cmljdCA9IHJlY29kZShzdWJfZGlzdHJpY3QsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzYWxxaW4iID0gIlNhbHFpbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZnJpbiIgPSAiQWZyaW4iKSkgJT4lIA0KICBncm91cF9ieShnb3Zlcm5vcmF0ZSwgc3ViX2Rpc3RyaWN0KSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgLmdyb3VwcyA9ICJkcm9wIikgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBtdXRhdGUoc3ViX2Rpc3RyaWN0ID0gZmN0X3Jlb3JkZXIoc3ViX2Rpc3RyaWN0LCBiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBiZW5lZmljaWFyaWVzLCB5ID0gc3ViX2Rpc3RyaWN0KSkgKyANCiAgZ2VvbV9jb2woYWVzKGZpbGwgPSBnb3Zlcm5vcmF0ZSkpICsgDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb21tYShiZW5lZmljaWFyaWVzKSksIA0KICAgICAgICAgICAgaGp1c3QgPSAiaW53YXJkIikgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzX2QoYmVnaW4gPSAuMykgKyANCiAgbGFicyh0aXRsZSA9ICJNUEMgYmVuZWZpY2lhcmllcyBieSBkaXN0cmljdCIsIA0KICAgICAgIHN1YnRpdGxlID0gcGFzdGUwKCJhcyBvZiAiLCByZXBvcnRfZGF0ZSksIA0KICAgICAgIHkgPSAiIikgKyANCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArIA0KDQpobm8gJT4lIA0KICBmaWx0ZXIoYWRtaW4ybmFtZV9lbiAlaW4lIGMoIkhhcmltIiwgIklkbGViIiwgIkppc3ItQXNoLVNodWd1ciIsICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBZnJpbiIsICJKZWJlbCBTYW1hbiIsICJBJ3pheiIsICJKYXJhYmx1cyIsICJBbCBCYWIiKSkgJT4lIA0KICBncm91cF9ieShnb3Zlcm5vcmF0ZSA9IGFkbWluMW5hbWVfZW4sIGFkbWluM3Bjb2RlKSAlPiUgDQogIHN1bW1hcmlzZSh0b3RhbF9wb3B1bGF0aW9uID0gc3VtKHRvdGFsX3BvcHVsYXRpb24sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgLmdyb3VwcyA9ICJkcm9wIikgJT4lDQogIGxlZnRfam9pbigNCiAgICBjYnIgJT4lDQogICAgICAgbXV0YXRlKHN1Yl9kaXN0cmljdCA9IHJlY29kZShzdWJfZGlzdHJpY3QsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzYWxxaW4iID0gIlNhbHFpbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZnJpbiIgPSAiQWZyaW4iKSkgJT4lIA0KICAgICAgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUgIA0KICAgICAgZ3JvdXBfYnkoc3ViX2Rpc3RyaWN0LCBhZG1pbjNwY29kZSkgJT4lIA0KICAgICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAuZ3JvdXBzID0gImRyb3AiKSwgDQogICAgYnkgPSAiYWRtaW4zcGNvZGUiKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShzdWJfZGlzdHJpY3QpKSAlPiUgDQogIG11dGF0ZShzdWJfZGlzdHJpY3QgPSBmY3RfcmVvcmRlcihzdWJfZGlzdHJpY3QsIGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIG11dGF0ZShwY19yZWFjaGVkID0gcm91bmQoYmVuZWZpY2lhcmllcyAvIHRvdGFsX3BvcHVsYXRpb24gKiAxMDAsIGRpZ2l0cyA9IDEpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHBjX3JlYWNoZWQsIHkgPSBzdWJfZGlzdHJpY3QpKSArDQogIGdlb21fY29sKGFlcyhmaWxsID0gZ292ZXJub3JhdGUpKSArIA0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEocGNfcmVhY2hlZCkpLCANCiAgICAgICAgICAgIGhqdXN0ID0gImlud2FyZCIpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzX2QoYmVnaW4gPSAuMykgKyANCiAgbGFicyh0aXRsZSA9ICJQZXJjZW50IG9mIHBvcHVsYXRpb24gcmVhY2hlZCIsIA0KICAgICAgIHN1YnRpdGxlID0gcGFzdGUwKCJhcyBvZiAiLCByZXBvcnRfZGF0ZSksIA0KICAgICAgIHkgPSAiIiwgDQogICAgICAgeCA9ICIlIG9mIHBvcHVsYXRpb24gcmVhY2hlZCIpICsNCiAgDQogIHBsb3RfbGF5b3V0KGd1aWRlcyA9ICJjb2xsZWN0IikgJiANCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpDQoNCmdnc2F2ZSgiLi9pbWcvbXBjX2J5X3N1Yl9kaXN0cmljdC5wbmciLCBkcGkgPSAzMDAsIGhlaWdodCA9IDguMjcsIHdpZHRoID0gMTEuNjksIHVuaXRzID0gImluIikgIA0KYGBgDQoNCjxicj48YnI+DQoNCiMjIyAzLjIgQ29tcGFyaXNvbnMgd2l0aCBQSU4gYW5kIGVhcnRocXVha2UgZGFtYWdlDQoNClRoZSBwbG90IGJlbG93IHNob3dzIHRoZSB0b3RhbCBwb3B1bGF0aW9uIG9mIGVhY2ggc3ViLWRpc3RyaWN0IG9uIHRoZSB4LWF4aXMgKGZvciB0aGUgbW9tZW50LCBhbGwgcGVyc29ucyBpbiB0aGVzZSBhcmVhcyBhcmUgYXNzdW1lZCB0byBiZSBhZmZlY3RlZCBhbmQgYXJlIGluY2x1ZGVkIGluIHRoZSBQSU4pIGFuZCB0aGUgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgb24gdGhlIHktYXhpcy4gDQoNClRoZSBzaXplIG9mIGVhY2ggcG9pbnQgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgZGVhZCBvciB3b3VuZGVkIHBlcnNvbnMgdGhlcmUgcGVyIDEwMCwwMDAuIA0KDQo8YnI+DQoNCmBgYHtyIGZpZy5oZWlnaHQ9Nn0NCmVxICU+JSANCiAgbGVmdF9qb2luKGhubyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChnb3Zlcm5vcmF0ZSA9IGFkbWluMW5hbWVfZW4sIA0KICAgICAgICAgICAgICAgICAgICAgZGlzdHJpY3QgPSBhZG1pbjJuYW1lX2VuLCANCiAgICAgICAgICAgICAgICAgICAgIHN1Yl9kaXN0cmljdCA9IGFkbWluM25hbWVfZW4sIA0KICAgICAgICAgICAgICAgICAgICAgYWRtaW4zcGNvZGUpLCANCiAgICAgICAgICAgIGJ5ID0gImFkbWluM3Bjb2RlIikgJT4lDQogIGZpbHRlcihhZG1pbjNwY29kZSAlaW4lIG53X3Bjb2RlMyAmIA0KICAgICAgICAgICBkaXN0cmljdCAlaW4lIGMoIkhhcmltIiwgIklkbGViIiwgIkppc3ItQXNoLVNodWd1ciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWZyaW4iLCAiSmViZWwgU2FtYW4iLCAiQSd6YXoiLCAiSmFyYWJsdXMiLCAiQWwgQmFiIikpICU+JSANCiAgZ3JvdXBfYnkoZ292ZXJub3JhdGUsIGRpc3RyaWN0LCBzdWJfZGlzdHJpY3QsIGFkbWluM3Bjb2RlKSAlPiUgDQogIHN1bW1hcmlzZSh3b3VuZGVkX2RlYWQgPSBzdW0od291bmRlZF9kZWFkLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIGRhbWFnZWRfaG91c2VzID0gc3VtKGRhbWFnZWRfaG91c2VzLCBuYS5ybSA9IFRSVUUpKSAlPiUNCiAgbGVmdF9qb2luKGhubyAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcihhZG1pbjNwY29kZSAlaW4lIG53X3Bjb2RlMyAmDQogICAgICAgICAgICAgICAgICAgICAgIGFkbWluMm5hbWVfZW4gJWluJSBjKCJIYXJpbSIsICJJZGxlYiIsICJKaXNyLUFzaC1TaHVndXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFmcmluIiwgIkplYmVsIFNhbWFuIiwgIkEnemF6IiwgIkphcmFibHVzIiwgIkFsIEJhYiIpKSAlPiUNCiAgICAgICAgICAgICAgZ3JvdXBfYnkoYWRtaW4zcGNvZGUpICU+JQ0KICAgICAgICAgICAgICBzdW1tYXJpc2UocG9wdWxhdGlvbiA9IHN1bSh0b3RhbF9wb3B1bGF0aW9uLCBuYS5ybSA9IFRSVUUpKSwgDQogICAgICAgICAgICBieSA9ICJhZG1pbjNwY29kZSIpICU+JSANCiAgbXV0YXRlKHdvdW5kZWRfZGVhZF8xMDBrID0gcm91bmQod291bmRlZF9kZWFkIC8gcG9wdWxhdGlvbiAqIDEwMDAwMCwgZGlnaXRzID0gMiksIA0KICAgICAgICAgZGFtYWdlZF9ob3VzZXNfMTAwayA9IHJvdW5kKGRhbWFnZWRfaG91c2VzIC8gcG9wdWxhdGlvbiAqIDEwMDAwMCwgZGlnaXRzID0gMikpICU+JSANCiAgICBsZWZ0X2pvaW4oY2JyICU+JSANCiAgICAgICAgICAgICAgICBmaWx0ZXIocHJvamVjdF9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSANCiAgICAgICAgICAgICAgICBncm91cF9ieShhZG1pbjNwY29kZSkgJT4lIA0KICAgICAgICAgICAgICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSkpLCANCiAgICAgICAgICAgICAgYnkgPSAiYWRtaW4zcGNvZGUiKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHBvcHVsYXRpb24sIHkgPSBiZW5lZmljaWFyaWVzKSkgKyANCiAgZ2VvbV9wb2ludChhZXMoc2l6ZSA9IHdvdW5kZWRfZGVhZF8xMDBrKSkgKyANCiAgZ2VvbV90ZXh0X3JlcGVsKGFlcyhsYWJlbCA9IHN1Yl9kaXN0cmljdCksDQogICAgICAgICAgICAgICAgICAgcG9pbnQucGFkZGluZyA9IC41LCANCiAgICAgICAgICAgICAgICAgICBzZWdtZW50LmNvbG9yID0gImdyZXk1MCIsIHNpemUgPSAzKSArDQogIHNjYWxlX3hfbG9nMTAoYnJlYWtzID0gYygwLCAzMDAwLCAxMDAwMCwgMzAwMDAsIDEwMDAwMCwgMzAwMDAwLCAxMDAwMDAwKSwgDQogICAgICAgICAgICAgICAgbGFiZWxzID0gY29tbWEpICsgDQogIHNjYWxlX3lfbG9nMTAoYnJlYWtzID0gYygwLCAxMDAwLCAzMDAwLCAxMDAwMCwgMzAwMDAsIDEwMDAwMCksDQogICAgICAgICAgICAgICAgbGFiZWxzID0gY29tbWEpICsgDQogIHNjYWxlX3NpemUoYnJlYWtzID0gYygwLCAxMDAsIDUwMCwgMTAwMCwgMzAwMCkpICsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSwgY29sb3VyID0gImJsdWUiLCBzaXplID0gLjUpICsNCiAgbGFicyh0aXRsZSA9ICJQb3B1bGF0aW9uIGFuZCBNUEMgYmVuZWZpY2lhcmllcyBieSBzdWItZGlzdHJpY3QiLA0KICAgICAgIHN1YnRpdGxlID0gIlNpemUgaW5kaWNhdGVzIGRlYWQvd291bmRlZCBwZXIgMTAwLDAwMDAiLCANCiAgICAgICB4ID0gIlBvcHVsYXRpb24iLCANCiAgICAgICB5ID0gIkJlbmVmaWNpYXJpZXMiLCANCiAgICAgICBzaXplID0gIkRlYWQvd291bmRlZFxucGVyIDEwMGsiLCANCiAgICAgICBjYXB0aW9uID0gIkRhdGEgZnJvbSBDV0csIEZTTCBhbmQgQUNVIikgKw0KICB0aGVtZShwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAuNSkpIA0KICANCiANCmBgYA0KDQo8YnI+IA0KDQpUaGUgaGlnaGVyIG9yIGxvd2VyIGEgc3ViLWRpc3RyaWN0IGlzIGFib3ZlIHRoZSBibHVlIGxpbmUsIHRoZSBtb3JlIGRpc3Byb3BvcnRpb25hdGUgdGhlIG51bWJlciBvZiBiZW5lZmljaWFyaWVzIGFsbG9jYXRlZCB0byB0aGF0IGxvY2F0aW9uIGFyZS4gDQoNClRoaXMgc2hvdWxkIGFsc28gYmUgY29tcGFyZWQgdG8gZWFjaCBzdWItZGlzdHJpY3QncyBzaGFyZSBvZiB0aGUgZWFydGhxdWFrZSBkYW1hZ2UuIE9mIHBhcnRpY3VsYXIgbm90ZSwgc3ViLWRpc3RyaWN0cyBpbiBncmV5IGhhdmUgeWV0IHRvIHJlY2VpdmUgYW55IE1QQyBhc3Npc3RhbmNlLiANCg0KPGJyPg0KDQpgYGB7ciBmaWcuaGVpZ2h0PTZ9DQplcSAlPiUgDQogIGxlZnRfam9pbihobm8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoZ292ZXJub3JhdGUgPSBhZG1pbjFuYW1lX2VuLCANCiAgICAgICAgICAgICAgICAgICAgIGRpc3RyaWN0ID0gYWRtaW4ybmFtZV9lbiwgDQogICAgICAgICAgICAgICAgICAgICBzdWJfZGlzdHJpY3QgPSBhZG1pbjNuYW1lX2VuLCANCiAgICAgICAgICAgICAgICAgICAgIGFkbWluM3Bjb2RlKSwgDQogICAgICAgICAgICBieSA9ICJhZG1pbjNwY29kZSIpICU+JQ0KICBmaWx0ZXIoYWRtaW4zcGNvZGUgJWluJSBud19wY29kZTMgJiANCiAgICAgICAgICAgZGlzdHJpY3QgJWluJSBjKCJIYXJpbSIsICJJZGxlYiIsICJKaXNyLUFzaC1TaHVndXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFmcmluIiwgIkplYmVsIFNhbWFuIiwgIkEnemF6IiwgIkphcmFibHVzIiwgIkFsIEJhYiIpKSAlPiUgDQogIGdyb3VwX2J5KGdvdmVybm9yYXRlLCBkaXN0cmljdCwgc3ViX2Rpc3RyaWN0LCBhZG1pbjNwY29kZSkgJT4lIA0KICBzdW1tYXJpc2Uod291bmRlZF9kZWFkID0gc3VtKHdvdW5kZWRfZGVhZCwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICBkYW1hZ2VkX2hvdXNlcyA9IHN1bShkYW1hZ2VkX2hvdXNlcywgbmEucm0gPSBUUlVFKSkgJT4lDQogIGxlZnRfam9pbihobm8gJT4lIA0KICAgICAgICAgICAgICBmaWx0ZXIoYWRtaW4zcGNvZGUgJWluJSBud19wY29kZTMgJg0KICAgICAgICAgICAgICAgICAgICAgICBhZG1pbjJuYW1lX2VuICVpbiUgYygiSGFyaW0iLCAiSWRsZWIiLCAiSmlzci1Bc2gtU2h1Z3VyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBZnJpbiIsICJKZWJlbCBTYW1hbiIsICJBJ3pheiIsICJKYXJhYmx1cyIsICJBbCBCYWIiKSkgJT4lDQogICAgICAgICAgICAgIGdyb3VwX2J5KGFkbWluM3Bjb2RlKSAlPiUNCiAgICAgICAgICAgICAgc3VtbWFyaXNlKHBvcHVsYXRpb24gPSBzdW0odG90YWxfcG9wdWxhdGlvbiwgbmEucm0gPSBUUlVFKSksIA0KICAgICAgICAgICAgYnkgPSAiYWRtaW4zcGNvZGUiKSAlPiUgDQogIG11dGF0ZSh3b3VuZGVkX2RlYWRfMTAwayA9IHJvdW5kKHdvdW5kZWRfZGVhZCAvIHBvcHVsYXRpb24gKiAxMDAwMDAsIGRpZ2l0cyA9IDIpLCANCiAgICAgICAgIGRhbWFnZWRfaG91c2VzXzEwMGsgPSByb3VuZChkYW1hZ2VkX2hvdXNlcyAvIHBvcHVsYXRpb24gKiAxMDAwMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogICAgbGVmdF9qb2luKGNiciAlPiUgDQogICAgICAgICAgICAgICAgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUgDQogICAgICAgICAgICAgICAgZ3JvdXBfYnkoYWRtaW4zcGNvZGUpICU+JSANCiAgICAgICAgICAgICAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpKSwgDQogICAgICAgICAgICAgIGJ5ID0gImFkbWluM3Bjb2RlIikgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBkYW1hZ2VkX2hvdXNlcywgeSA9IHdvdW5kZWRfZGVhZCkpICsgDQogIGdlb21fcG9pbnQoYWVzKHNpemUgPSB3b3VuZGVkX2RlYWRfMTAwaywgDQogICAgICAgICAgICAgICAgIGNvbG91ciA9IGJlbmVmaWNpYXJpZXMpKSArIA0KICBnZW9tX3RleHRfcmVwZWwoYWVzKGxhYmVsID0gc3ViX2Rpc3RyaWN0KSwNCiAgICAgICAgICAgICAgICAgICBwb2ludC5wYWRkaW5nID0gLjUsIA0KICAgICAgICAgICAgICAgICAgIHNlZ21lbnQuY29sb3IgPSAiZ3JleTUwIiwgc2l6ZSA9IDMpICsNCiAgc2NhbGVfeF9sb2cxMChsYWJlbHMgPSBjb21tYSkgKyANCiAgc2NhbGVfeV9sb2cxMChsYWJlbHMgPSBjb21tYSkgKyANCiAgc2NhbGVfY29sb3VyX3ZpcmlkaXMob3B0aW9uID0gIm1ha28iLCBkaXJlY3Rpb24gPSAtMSwgDQogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGNvbW1hKSArIA0KICBzY2FsZV9zaXplKGJyZWFrcyA9IGMoMCwgMTAwLCA1MDAsIDEwMDAsIDMwMDApKSArIA0KICBsYWJzKHggPSAiTnVtYmVyIG9mIGRhbWFnZWQgaG91c2VzIiwgDQogICAgICAgeSA9ICJOdW1iZXIgb2Ygd291bmRlZCBhbmQgZGVhZCIsIA0KICAgICAgIHRpdGxlID0gIk1hZ25pdHVkZSBvZiBlYXJ0aHF1YWtlIGltcGFjdHMgYnkgc3ViLWRpc3RyaWN0IiwgDQogICAgICAgc3VidGl0bGUgPSAiU2l6ZSBzaG93cyBzZXZlcml0eSAod291bmRlZC9kZWFkIHBlciAxMDBrKSBhbmQgY29sb3VyIHNob3dzIGJlbmVmaWNpYXJpZXMiLCANCiAgICAgICBzaXplID0gIldvdW5kZWQvZGVhZFxucGVyIDEwMGsiLCANCiAgICAgICBjb2xvdXIgPSAiQmVuZWZpY2lhcmllcyIsIA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBmcm9tIENXRywgRlNMIGFuZCBBQ1UiKQ0KYGBgDQoNCjxicj4NCg0KVGhlIENXRyBpcyBjdXJyZW50bHkgd29ya2luZyBvbiBhIHByaW9yaXRpc2F0aW9uIHNjb3JlLCB3aGljaCBjYW4gYmUgYSB1c2VmdWwgc2hvcnRoYW5kLCB0aGF0IHdpbGwgdGFrZSBpbnRvIGFjY291bnQgcHJlLWV4aXN0aW5nIHZ1bG5lcmFiaWxpdHkgKGxpa2VseSBmcm9tIHRoZSBNU05BKSBhcyB3ZWxsIGFzIGVhcnRocXVha2UgaW1wYWN0cy4gDQoNCjxicj48YnI+DQoNCg0KIyMjIDMuMyBQbGFubmVkIGFjdGl2aXRpZXMgDQoNCmBgYHtyfQ0KY2JyICU+JSANCiAgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJQbGFubmVkIikgJT4lDQogIGZpbHRlcihnb3Zlcm5vcmF0ZSA9PSAiQWxlcHBvIikgJT4lICANCiAgZ3JvdXBfYnkoc3ViX2Rpc3RyaWN0KSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gYmVuZWZpY2lhcmllcywgeSA9IGZjdF9yZW9yZGVyKHN1Yl9kaXN0cmljdCwgYmVuZWZpY2lhcmllcykpKSArIA0KICBnZW9tX2NvbChmaWxsID0gIiM0MWI2YzQiKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb21tYShiZW5lZmljaWFyaWVzKSksIGhqdXN0ID0gImlud2FyZCIpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArIA0KICBsYWJzKHRpdGxlID0gIlBsYW5uZWQgYmVuZWZpY2lhcmllcyAtLSBBbGVwcG8iLCANCiAgICAgICB4ID0gIlBsYW5uZWQgYmVuZWZpY2lhcmllcyIsIA0KICAgICAgIHkgPSAiIikgKyANCg0KY2JyICU+JSANCiAgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJQbGFubmVkIikgJT4lDQogIGZpbHRlcihnb3Zlcm5vcmF0ZSA9PSAiSWRsZWIiICYgIWlzLm5hKGFkbWluM3Bjb2RlKSkgJT4lICANCiAgZ3JvdXBfYnkoc3ViX2Rpc3RyaWN0KSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gYmVuZWZpY2lhcmllcywgeSA9IGZjdF9yZW9yZGVyKHN1Yl9kaXN0cmljdCwgYmVuZWZpY2lhcmllcykpKSArIA0KICBnZW9tX2NvbChmaWxsID0gImxpZ2h0Z29sZGVucm9kIikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEoYmVuZWZpY2lhcmllcykpLCBoanVzdCA9ICJpbndhcmQiKSArDQogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSB1bml0X2Zvcm1hdCh1bml0ID0gIksiLCBzY2FsZSA9IDFlLTMsIGFjY3VyYWN5ID0gMSkpICsgDQogIGxhYnModGl0bGUgPSAiUGxhbm5lZCBiZW5lZmljaWFyaWVzIC0tIElkbGViIiwgDQogICAgICAgeCA9ICJQbGFubmVkIGJlbmVmaWNpYXJpZXMiLCANCiAgICAgICB5ID0gIiIpICArIA0KDQogIHBsb3RfbGF5b3V0KHdpZHRocyA9IGMoMiwgMykpDQoNCiMgZ2dzYXZlKCIuL2ltZy9wbGFubmVkX2J5X3N1Yl9kaXN0cmljdC5wbmciLCBkcGkgPSAzMDAsIGhlaWdodCA9IDguMjcsIHdpZHRoID0gMTEuNjksIHVuaXRzID0gImluIikNCg0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQojIDQuIENhc2ggcmVzcG9uc2UgYWN0b3JzIGFuZCBjYXNoIGRpc2J1cnNlZA0KDQpJbiB0aGUgc2NhdHRlcnBsb3QgYmVsb3csIGVhY2ggcG9pbnQgaXMgYSBzaW5nbGUgY2FzaCB3b3JraW5nIGdyb3VwIHBhcnRuZXIuIFRoZSB4LWF4aXMgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkIHBlciBhZ2VuY3kgYW5kIHRoZSB5LWF4aXMgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgY29tbXVuaXRpZXMgKGFkbWluNCkgcmVhY2hlZC4gDQoNCjxicj4NCg0KYGBge3IgdG90YWxzLCBldmFsID0gRkFMU0V9DQoNCmZzbCAlPiUgDQogIGZpbHRlcihhY3Rpdml0eSA9PSAiQ2FzaCBSZXNwb25zZSIgJiBwbGFubmVkX2ltcGxlbWVudGVkID09ICJJbXBsZW1lbnRlZCIpICU+JSANCiAgbXV0YXRlKHVzZF90b3RhbCA9IGZhbWlsaWVzICogcXVhbnRpdHkpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICB1c2RfdG90YWwgPSBzdW0odXNkX3RvdGFsLCBuYS5ybSA9IFRSVUUpKQ0KDQpgYGANCg0KDQoNCg0KYGBge3IgcGFydG5lci1zY2F0dGVyfQ0KcGFydG5lcl9zY2F0dGVyIDwtIGNiciAlPiUgDQogICBmaWx0ZXIocHJvamVjdF9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSANCiAgZ3JvdXBfYnkoaW1wbGVtZW50aW5nX3BhcnRuZXIsIA0KICAgICAgICAgICBhZG1pbjJwY29kZSwgDQogICAgICAgICAgIGFkbWluNHBjb2RlKSAlPiUgDQogIHNsaWNlKHdoaWNoLm1heChiZW5lZmljaWFyaWVzKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBncm91cF9ieShpbXBsZW1lbnRpbmdfcGFydG5lcikgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIGNvbW11bml0aWVzID0gbl9kaXN0aW5jdChhZG1pbjRwY29kZSkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gYmVuZWZpY2lhcmllcywgeSA9IGNvbW11bml0aWVzKSkgKw0KICBnZW9tX3BvaW50KGFlcyhzaXplID0gYmVuZWZpY2lhcmllcywgDQogICAgICAgICAgICAgICAgIHRleHQgPSBwYXN0ZTAoaW1wbGVtZW50aW5nX3BhcnRuZXIsICJcbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZW5lZmljaWFyaWVzOiAiLCBmb3JtYXQoYmVuZWZpY2lhcmllcywgYmlnLm1hcmsgPSAiLCIpLCAiXG4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tbXVuaXRpZXM6ICIsIGNvbW11bml0aWVzKSkpICsgDQogIHNjYWxlX3hfbG9nMTAobGFiZWxzID0gY29tbWEpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKyANCiAgbGFicyh4ID0gIkJlbmVmaWNpYXJpZXMgcmVhY2hlZCIsIA0KICAgICAgIHkgPSAiQ29tbXVuaXRpZXMgKGFkbWluNCkgcmVhY2hlZCIsIA0KICAgICAgIHRpdGxlID0gIkltcGxlbWVudGluZyBwYXJ0bmVycyAtLSBiZW5lZmljaWFyaWVzIGFuZCBjb21tdW5pdGllcyByZWFjaGVkIikNCg0KZ2dwbG90bHkocGFydG5lcl9zY2F0dGVyLCB0b29sdGlwID0gYygidGV4dCIpKSAlPiUgDQogIGxheW91dChzaG93bGVnZW5kID0gVFJVRSwgbGVnZW5kID0gbGlzdChmb250ID0gKGxpc3Qoc2l6ZSA9IDYpKSkpICU+JSANCiAgcGxvdGx5OjpzdHlsZShob3Zlcm9uID0gInBvaW50IikgJT4lIA0KICBsYXlvdXQodGl0bGUgPSBsaXN0KHRleHQgPSBwYXN0ZTAoIkJlbmVmaWNpYXJpZXMgYW5kIGNvbW11bml0aWVzIHJlYWNoZWQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxzdXA+IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYXNoIHJlc3BvbnNlIGltcGxlbWVudGluZyBwYXJ0bmVyczsgbW91c2Ugb3ZlciBmb3IgZGV0YWlscyIsIjwvc3VwPiIpKSkNCg0KDQpgYGANCg0KPGJyPg0KDQpVU0QgYHIgcGFzdGUocm91bmQoY2JyICU+JSBmaWx0ZXIocHJvamVjdF9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kdG90YWxfdXNkKX0gLyAxMDAwMDAwLCBkaWdpdHMgPSAxKSwgIm1pbGxpb24iKWAgaGFzIGJlZW4gZGlzdHJpYnV0ZWQgYWNyb3NzIGByIGNiciAlPiUgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge25fZGlzdGluY3QoLiRhZG1pbjRwY29kZSl9YCBjb21tdW5pdGllcyBhbmQgYHIgY2JyICU+JSBmaWx0ZXIocHJvamVjdF9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7bl9kaXN0aW5jdCguJGFkbWluM3Bjb2RlKX1gIHN1Yi1kaXN0cmljdHMgaW4gTlcgU3lyaWEuDQoNCg0KVGhlIHRhYmxlIGJlbG93IHN1bW1hcmlzZXMgdGhlIGluZm9ybWF0aW9uIGluIHRoZSBzY2F0dGVycGxvdCBhYm92ZSBpbiB0YWJ1bGFyIGZvcm06DQoNCjxicj4NCg0KDQpgYGB7cn0NCmNiciAlPiUgDQogIGZpbHRlcihwcm9qZWN0X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICBncm91cF9ieShpbXBsZW1lbnRpbmdfcGFydG5lciwgDQogICAgICAgICAgIGFkbWluMnBjb2RlLCANCiAgICAgICAgICAgYWRtaW40cGNvZGUpICU+JSANCiAgc2xpY2Uod2hpY2gubWF4KGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGdyb3VwX2J5KGltcGxlbWVudGluZ19wYXJ0bmVyKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgZGlzdHJpY3RzID0gbl9kaXN0aW5jdChhZG1pbjJwY29kZSksIA0KICAgICAgICAgICAgY29tbXVuaXRpZXMgPSBuX2Rpc3RpbmN0KGFkbWluNHBjb2RlKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MoYmVuZWZpY2lhcmllcykpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICBzZXRfY2FwdGlvbigiUmVhY2ggYW5kIGZvb3RwcmludCBvZiBjYXNoIHJlc3BvbnNlIGFjdG9ycyIpICU+JSANCiAgdGhlbWVfemVicmEoKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuOCkgJT4lIA0KICBmb290bm90ZShhc19wYXJhZ3JhcGgoIk9ubHkgcGFydG5lcnMgd2hvIHByb3ZpZGVkIG1vcmUgdGhhbiBVU0QgMTAwL2ZhbWlseS9tb250aCIpLCANCiAgICAgICAgICAgaSA9IDEsIGogPSAxLCBwYXJ0ID0gImhlYWRlciIsIGlubGluZSA9IFRSVUUsIHJlZl9zeW1ib2xzID0gIjEiKQ0KICANCmBgYA0KDQo8YnI+PGJyPg0KDQojIyMgNC4xIFVTRCBkaXNidXJzZWQgcGVyIHBhcnRuZXINCg0KPGJyPg0KDQpgYGB7cn0NCmNiciAlPiUgDQogIGZpbHRlcihwcm9qZWN0X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICBncm91cF9ieShpbXBsZW1lbnRpbmdfcGFydG5lcikgJT4lIA0KICBzdW1tYXJpc2UodG90YWxfdXNkID0gc3VtKHRvdGFsX3VzZCwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICBmYW1pbGllcyA9IHN1bShmYW1pbGllcywgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBtdXRhdGUodXNkX3Blcl9mYW0gPSByb3VuZCh0b3RhbF91c2QgLyBmYW1pbGllcywgZGlnaXRzID0gMiksIA0KICAgICAgICAgYCVfdXNkX3RvdGFsYCA9IHJvdW5kKHRvdGFsX3VzZCAvIHN1bSh0b3RhbF91c2QpICogMTAwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWdpdHMgPSAyKSkgJT4lIA0KICBhcnJhbmdlKGRlc2ModG90YWxfdXNkKSkgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHNldF9jYXB0aW9uKCJVU0QgZGlzYnVyc2VkIGFuZCBmYW1pbGllcyByZWFjaGVkIGJ5IHBhcnRuZXIiKSAlPiUgDQogIHRoZW1lX3plYnJhKCkgJT4lIA0KICBmbGV4dGFibGU6OnNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuOCkNCmBgYA0KDQo8YnI+DQoNClRoZSBDV0cgaXMgY3VycmVudGx5IHdvcmtpbmcgd2l0aCBvdGhlciBDbHVzdGVycyB0byBjb25zb2xpZGF0ZSBhbGwgY2FzaC1iYXNlZCBhY3Rpdml0aWVzIGFuZCB3aWxsIHNvb24gYmUgYWJsZSB0byBwcm92aWRlIG1vcmUgY29tcHJlaGVuc2l2ZSByZXBvcnRpbmcuIA0KDQoNCjxicj48YnI+PGJyPg0KDQojIDUuIEFubmV4ZXMNCg0KPGJyPg0KDQojIyMgNS4xIEludGVyYWN0aXZlIHJlZmVyZW5jZSB0YWJsZSBhdCBzdWItZGlzdHJpY3QgbGV2ZWwNCg0KQ29sdW1ucyBpbmNsdWRlOiANCmBnb3Zlcm5vcmF0ZWAsIGBkaXN0cmljdGAsIGBzdWItZGlzdHJpY3RgLCANCmB0b3RhbCBwb3B1bGF0aW9uYCwgYGJlbmVmaWNpYXJpZXNgLCBgdG90YWwgdXNkIGRpc2J1cnNlZGAsIA0KYHdvdW5kZWQgYW5kIGRlYWRgLCBgd291bmRlZCBhbmQgZGVhZCBwZXIgMTAwa2AsIA0KYGRhbWFnZWQgaG91c2VzYCwgYGRhbWFnZWQgaG91c2VzIHBlciAxMDBrYCwgDQpgYWRtaW4zcGNvZGVgDQoNCmBgYHtyfQ0KZXEgJT4lIA0KICBsZWZ0X2pvaW4obG9jYXRpb25zICU+JSBkaXN0aW5jdChhZG1pbjNwY29kZSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJfZGlzdHJpY3QgPSBhZG1pbjNuYW1lX2VuLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdHJpY3QgPSBhZG1pbjJuYW1lX2VuLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ292ZXJub3JhdGUgPSBhZG1pbjFuYW1lX2VuKSwgDQogICAgICAgICAgICBieSA9ICJhZG1pbjNwY29kZSIpICU+JSANCiAgbGVmdF9qb2luKGNiciAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcihwcm9qZWN0X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICAgICAgICAgICAgICBncm91cF9ieShhZG1pbjNwY29kZSkgJT4lIA0KICAgICAgICAgICAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX3VzZCA9IHN1bSh0b3RhbF91c2QsIG5hLnJtID0gVFJVRSkpLCANCiAgICAgICAgICAgIGJ5ID0gImFkbWluM3Bjb2RlIikgJT4lIA0KICBzZWxlY3QoZ292ZXJub3JhdGUsIGRpc3RyaWN0LCBzdWJfZGlzdHJpY3QsIA0KICAgICAgICAgdG90YWxfcG9wdWxhdGlvbiwgDQogICAgICAgICBiZW5lZmljaWFyaWVzLCB0b3RhbF91c2QsIA0KICAgICAgICAgd291bmRlZF9kZWFkLCB3b3VuZGVkX2RlYWRfMTAwaywgDQogICAgICAgICBkYW1hZ2VkX2hvdXNlcywgZGFtYWdlZF9ob3VzZXNfMTAwaywgDQogICAgICAgICBhZG1pbjNwY29kZSkgJT4lIA0KICBkYXRhdGFibGUob3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aCA9IDEwLCBzY3JvbGxYID0gVFJVRSksIA0KICAgICAgICAgICAgZmlsdGVyID0gbGlzdChwb3NpdGlvbiA9ICJ0b3AiLCBjbGVhciA9IEZBTFNFKSwNCiAgICAgICAgICAgIGNhcHRpb24gPSBodG1sdG9vbHM6OnRhZ3MkY2FwdGlvbihzdHlsZSA9ICdjYXB0aW9uLXNpZGU6IHRvcDsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7IGZvbnQtc2l6ZToxMjAlIDsnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlZmVyZW5jZSB0YWJsZSAtLSBFYXJ0aHF1YWtlIGltcGFjdHMsIGZyb20gQUNVLCBleHRyYWN0ZWQgMjAyMzAzMjgiKSkgJT4lIA0KICBmb3JtYXRTdHlsZSgwLCB0YXJnZXQgPSAicm93IiwgbGluZUhlaWdodCA9ICI4MCUiLCBmb250U2l6ZSA9ICI4MCUiKSAlPiUgDQogIGZvcm1hdFJvdW5kKGMoIndvdW5kZWRfZGVhZF8xMDBrIiwgImRhbWFnZWRfaG91c2VzXzEwMGsiKSwgZGlnaXRzID0gMikgJT4lIA0KICBmb3JtYXRDdXJyZW5jeShjKCJ0b3RhbF9wb3B1bGF0aW9uIiwgDQogICAgICAgICAgICAgICAgICAgIndvdW5kZWRfZGVhZCIsICJkYW1hZ2VkX2hvdXNlcyIsIA0KICAgICAgICAgICAgICAgICAgICJiZW5lZmljaWFyaWVzIiwgInRvdGFsX3VzZCIpLCANCiAgICAgICAgICAgICAgICAgY3VycmVuY3kgPSAiIiwgaW50ZXJ2YWwgPSAzLCBtYXJrID0gIiwiKSAlPiUNCiAgZm9ybWF0Um91bmQoYygidG90YWxfcG9wdWxhdGlvbiIsIA0KICAgICAgICAgICAgICAgICJ3b3VuZGVkX2RlYWQiLCAiZGFtYWdlZF9ob3VzZXMiLA0KICAgICAgICAgICAgICAgICJiZW5lZmljaWFyaWVzIiwgInRvdGFsX3VzZCIpLCBkaWdpdHMgPSAwKQ0KICANCmBgYA0KDQo8YnI+PGJyPg0KDQojIyMgNS4yIFJlcG9ydGluZyBxdWFsaXR5IA0KDQpUaGlzIHNlY3Rpb24gZG9jdW1lbnRzIGlzc3VlcyBlbmNvdW50ZXJlZCBpbiB0aGUgY2xlYW5pbmcgb2YgNFcgYW5kIEZTTCBkYXRhIGFuZCB0aGVpciBpbXBhY3RzIG9uIHRoZSBxdWFsaXR5IG9mIHJlcG9ydGluZyB0aGUgQ1dHIGNhbiBwcm92aWRlLiANCg0KTm90ZSB0aGF0IHN1YnN0YW50aWFsIGNsZWFuaW5nIGhhcyBhbHJlYWR5IHRha2VuIHBsYWNlIGFuZCB0aGVzZSBvdXRzdGFuZGluZyBpc3N1ZXMgY291bGQgbm90IGJlIHJlc29sdmVkIGJ5IHRoZSB0aW1lIG9mIHJlcG9ydGluZy4gDQoNCkhvd2V2ZXIsIHRoZSBDV0cgcmVjb2duaXNlcyB0aGF0IG5vdCBhbGwgcmVwb3J0aW5nIGlzc3VlcyB3ZXJlIGR1ZSB0byBwYXJ0bmVyIGVycm9yLiBUaGUgQ1dHIHdpbGwgd29yayB3aXRoIHBhcnRuZXJzIHRvIGNvbnRpbnVlIGltcHJvdmluZyByZXBvcnRpbmcgcXVhbGl0eS4gDQoNCjxicj4gDQoNCmBgYHtyfQ0KY2JyICU+JSANCiAgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUgDQogIGdyb3VwX2J5KHNvdXJjZSkgJT4lIA0KICBzdW1tYXJpc2UocGFydG5lcnMgPSBuX2Rpc3RpbmN0KGltcGxlbWVudGluZ19wYXJ0bmVyKSwNCiAgICAgICAgICAgIGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgbXV0YXRlKGAlX2JlbmVmaWNpYXJpZXNgID0gcm91bmQoYmVuZWZpY2lhcmllcyAvIHN1bShiZW5lZmljaWFyaWVzKSAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICBzZXRfY2FwdGlvbigiU3RpbGwsIG9uZSB0aGlyZCBvZiByZXBvcnRpbmcgb3JpZ2luYXRlcyBmcm9tIHRoZSBGU0wgdHJhY2tlciIpICU+JSANCiAgdGhlbWVfemVicmEoKSAlPiUNCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiLCB3aWR0aCA9IC42KQ0KYGBgDQoNCjxicj4NCg0KQmVsb3cgaXMgYSBicmVha2Rvd24gb2YgcmVwb3J0aW5nIGJ5IGRhdGU6IA0KDQo8YnI+DQoNCmBgYHtyfQ0KY2JyICU+JSANCiAgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUgDQogIGdyb3VwX2J5KG1vbnRoID0gbW9udGgoZGlzdHJpYnV0aW9uX2RhdGUsIGxhYmVsID0gVFJVRSkpICU+JSANCiAgc3VtbWFyaXNlKHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lciksDQogICAgICAgICAgICBiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIG11dGF0ZShgJV9iZW5lZmljaWFyaWVzYCA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcykgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgc2V0X2NhcHRpb24oIkphbnVhcnkgcmVwb3J0aW5nIGlzIHN0aWxsIGxhcmdlbHkgaW5jb21wbGV0ZSIpICU+JSANCiAgdGhlbWVfemVicmEoKSAlPiUNCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiLCB3aWR0aCA9IC42KQ0KYGBgDQoNCjxicj4gDQoNCkFjdGl2aXRpZXMgcGVydGFpbmluZyB0byAxNCw0MzIgd2VyZSBtaXNzaW5nIHRoZWlyIGRhdGUgb3IgaGFkIGRhdGVzIGluIHVucmVhZGFibGUgZm9ybWF0cy4gSG93ZXZlciwgdGhlIGNvbHVtbnMgYHN0YXJ0IGRhdGVgLCBgZW5kIGRhdGVgIGFuZCBgbW9udGggb2YgcmVwb3J0aW5nYCB3ZXJlIHNvbWUgb2YgdGhlIG1vc3QgdHJvdWJsZXNvbWUgYW5kIGNvbnN1bWVkIGEgbGFyZ2UgcGFydCBvZiB0aGUgdGltZSBkZWRpY2F0ZWQgdG8gZGF0YSBjbGVhbmluZy4gDQoNClRoZSBDV0cgd291bGQgbGlrZSB0byByZWl0ZXJhdGUgdGhhdCBgc3RhcnQgZGF0ZWAgYW5kIGBlbmQgZGF0ZWAgc2hvdWxkIGJlIGVudGVyZWQgaW4gdGhlIGZvcm1hdCBtbS9kZC95eXl5IGFuZCB0aGF0IGBtb250aCBvZiByZXBvcnRpbmdgIHNob3VsZCBiZSBzZWxlY3RlZCBmcm9tIHRoZSBkcm9wZG93biBtZW51LiANCg0KPGJyPg0KDQpgYGB7cn0NCmNiciAlPiUgZ3JvdXBfYnkocHJvamVjdF9zdGF0dXMpICU+JSANCiAgc3VtbWFyaXNlKHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lciksIA0KICAgICAgICAgICAgYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIG11dGF0ZShgJV9iZW5lZmljaWFyaWVzYCA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcykgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgc2V0X2NhcHRpb24oIjEyIHBhcnRuZXJzIGhhdmUgcmVwb3J0ZWQgcGxhbm5lZCBhY3Rpdml0aWVzIikgJT4lIA0KICB0aGVtZV96ZWJyYSgpICU+JQ0KICBzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIsIHdpZHRoID0gLjYpDQpgYGANCg0KPGJyPg0KDQpUaGUgc3VtIG9mIHBsYW5uZWQgYmVuZWZpY2lhcmllcyBpcyBgciBmb3JtYXQoZmlsdGVyKGNiciwgcHJvamVjdF9zdGF0dXMgPT0gIlBsYW5uZWQiKSAlPiUge3N1bSguJGJlbmVmaWNpYXJpZXMpfSwgYmlnLm1hcmsgPSAiLCIpYC4gSWYgdGhpcyBpcyB0aGUgZXh0ZW50IG9mIGFsbCBwbGFubmVkIE1QQyBhY3Rpdml0aWVzLCB0aGUgQ1dHIGFzIGEgd2hvbGUgY2FuIGV4cGVjdCB0byByZWFjaCBhcm91bmQgNzclIG9mIGl0cyB0YXJnZXQgb2YgNjYyLDk0MiBwZXJzb25zLiANCg0KQmVsb3cgaXMgYSBicmVha2Rvd24gb2YgcGxhbm5lZCBhY3RpdGl2aXRpZXMgYnkgc291cmNlOg0KDQo8YnI+DQoNCg0KYGBge3J9DQpjYnIgJT4lIA0KICBmaWx0ZXIocHJvamVjdF9zdGF0dXMgPT0gIlBsYW5uZWQiKSAlPiUgDQogIGdyb3VwX2J5KHNvdXJjZSkgJT4lIA0KICBzdW1tYXJpc2UocGFydG5lcnMgPSBuX2Rpc3RpbmN0KGltcGxlbWVudGluZ19wYXJ0bmVyKSwgDQogICAgICAgICAgICBiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgbXV0YXRlKGAlX2JlbmVmaWNpYXJpZXNgID0gcm91bmQoYmVuZWZpY2lhcmllcyAvIHN1bShiZW5lZmljaWFyaWVzKSAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICBzZXRfY2FwdGlvbigiQnJlYWtkb3duIG9mIHBsYW5uZWQgYWN0aXZpdGllcyBieSBzb3VyY2UiKSAlPiUgDQogIHRoZW1lX3plYnJhKCkgJT4lDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuNikNCmBgYA0KDQoNCjxicj48YnI+DQoNCiMjIyA1LjMgRGlzYWdncmVnYXRpb25zIA0KDQoNCk9mIHRoZSA1NjUgcm93cyByZXBvcnRlZCB0aHJvdWdoIHRoZSA0V3MgKHRoZSBGU0wgdHJhY2tlciBkb2VzIG5vdCBhc2sgZm9yIGJlbmVmaWNpYXJ5IGRpc2FnZ3JlZ2F0aW9ucyksIG9ubHkgYHIgZm91ciAlPiUgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUgZmlsdGVyKCFpcy5uYShlbGRlcmx5X2ZlbWFsZXNfNjApIHwgIWlzLm5hKGVsZGVybHlfbWFsZXNfNjApKSAlPiUgbnJvdygpYCBoYXZlIGFueSB2YWx1ZXMgZm9yIHRoZSBudW1iZXJzIG9mIGVsZGVybHkgcGVyc29ucyByZWFjaGVkLiANCg0KVGhlIHRvdGFsIG51bWJlciBvZiBlbGRlcmx5IHBlcnNvbnMgcmVhY2hlZCBieSB0aGUgQ1dHIHBhcnRuZXJzIGlzIGByIGZvdXIgJT4lIGZpbHRlcihwcm9qZWN0X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHN1bW1hcmlzZShlbGRlcmx5ID0gcm91bmQoc3VtKGVsZGVybHlfZmVtYWxlc182MCwgbmEucm0gPSBUUlVFKSArIHN1bShlbGRlcmx5X21hbGVzXzYwLCBuYS5ybSA9IFRSVUUpLCBkaWdpdHMgPSAwKSkgJT4lIHB1bGwoKSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAuIFRoZSB0b3RhbCBudW1iZXIgb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkIGlzIGByIGZpbHRlcihjYnIsIHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGJlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYC4gDQoNCkl0IGlzIHVuY2xlYXIgaG93IGFibGUgcGFydG5lcnMgYXJlIHRvIGNvbXBseSB3aXRoIHNleC0gYW5kIGFnZS1kaXNhZ2dyZWdhdGVkIHJlcG9ydGluZy4gNDUyIG9mIHRoZSA1NjUgcm93cyByZXBvcnRlZCB0aHJvdWdoIHRoZSA0V3MgY29udGFpbiBzb21lIGZvcm0gb2Ygc2V4LWFuZC1hZ2UgZGlzYWdncmVnYXRpb24uIE9mIHRoZXNlLCBvbmx5IDM2NiByb3dzIGhhdmUgbm90IGNvcHkvcGFzdGVkIHRoZSBkaXNhZ2dyZWdhdGlvbnMgZnJvbSB0aGUgTVNOQSAoMTMlIG1lbiwgMjclIHdvbWVuLCAyOCUgYm95cyBhbmQgMzElIGdpcmxzKS4gRm9yIGFuYWx5c2lzIHB1cnBvc2VzLCB0aGVzZSBoYXZlIGJlZW4gZGlzY2FyZGVkLiBJbiBmdXR1cmUsIGl0IGlzIGFsd2F5cyBwcmVmZXJhYmxlIHRvIGxlYXZlIGRpc2FnZ3JlZ2F0aW9uIGNvbHVtbnMgYmxhbmsgYXMgb3Bwb3NlZCB0byBpbmNsdWRpbmcgdmFsdWVzIHRoYXQgaGF2ZSBiZWVuIGJhY2tmaWxsZWQgZnJvbSBhIGNlbnN1cyBvciBhIHN1cnZleSwgZXNwZWNpYWxseSBhcyB0aGlzIGJhY2tmaWxsaW5nIHdpbGwgYmUgZG9uZSBieSBPQ0hBIGFzIGEgZmluYWwgc3RlcCBpbiByZXBvcnRpbmcgYW55d2F5LiANCg0KVGhpcyBpcyBhIGhpc3RvZ3JhbSBvZiB0aGUgcmVtYWluaW5nIHZhbHVlczogDQoNCjxicj4NCg0KYGBge3J9DQpmb3VyICU+JSANCiAgZmlsdGVyKCFpcy5uYShtZW5fMThfNjApIHwgIWlzLm5hKHdvbWVuXzE4XzYwKSB8ICFpcy5uYShib3lzXzE4KSB8ICFpcy5uYShnaXJsc18xOCkpICU+JSANCiAgc2VsZWN0KGJlbmVmaWNpYXJpZXMsIG1lbl8xOF82MCwgd29tZW5fMThfNjAsIGJveXNfMTgsIGdpcmxzXzE4KSAlPiUgDQogIGFkb3JuX3BlcmNlbnRhZ2VzKCJyb3ciKSAlPiUgIA0KICBmaWx0ZXIobWVuXzE4XzYwICE9IC4xMyAgJiB3b21lbl8xOF82MCAhPSAuMjcpICU+JSANCiAgbXV0YXRlKHBjX21hbGUgPSBtZW5fMThfNjAgKyBib3lzXzE4KSAgJT4lICANCiAgZ2dwbG90KGFlcyh4ID0gcGNfbWFsZSkpICsgDQogIGdlb21fZGVuc2l0eShjb2xvdXIgPSAiYmx1ZSIsIGFscGhhID0gLjcpICsgDQogIGdlb21faGlzdG9ncmFtKGJpbnMgPSA1MCwgYWxwaGEgPSAuOCkgKyANCiAgc2NhbGVfeF9sb2cxMChsYWJlbHMgPSBwZXJjZW50KSArIA0KICBsYWJzKHRpdGxlID0gIkFibm9ybWFsIGRpc3RyaWJ1dGlvbiBvZiBtZW4gYXMgcGVyY2VudGFnZSBvZiBpbmRpdmlkdWFscyByZWFjaGVkIiwgDQogICAgICAgeCA9ICJNYWxlcyBhcyAlIG9mIHRvdGFsIiwgDQogICAgICAgeSA9ICJOdW1iZXIgb2Ygcm93cyIpDQpgYGANCg0KPGJyPg0KDQpUaGlzIGRpZmZlcnMgcXVpdGUgc2lnbmlmaWNhbnRseSBmcm9tIHdoYXQgd2Ugd291bGQgZXhwZWN0IHRvIHNlZSBpbiB0aGUgZ2VuZXJhbCBwb3B1bGF0aW9uIGFuZCBpcyBpbmRpY2F0aXZlIG9mICJ1bm5hdHVyYWwiIGRhdGEgaS5lLiBjb3B5L3Bhc3Rpbmcgb3IgYnJvYWQgZXN0aW1hdGlvbnMsIGFzIG9wcG9zZWQgdG8gYWN0dWFsIGNvdW50cy4gVGhlIHBlYWtzIGFyb3VuZCA0OSUgYW5kIDUwJSBzaG93IHRoYXQgdGhlc2Ugc2FtZSBwZXJjZW50YWdlcyB3ZXJlIGNvcHkvcGFzdGVkIG9udG8gYSBsYXJnZSBudW1iZXIgb2Ygcm93cy4gDQoNCkZvciByZWZlcmVuY2UsIHRoaXMgdGhlIHBlcmNlbnRhZ2Ugb2YgbWFsZXMgYXMgYSBwcm9wb3J0aW9uIG9mIHRoZSBwZW9wbGUgaW4gbmVlZCBwZXIgc3ViLWRpc3RyaWN0LiBUaGUgZGlzdHJpYnV0aW9uIGlzIHJvdWdobHkgbm9ybWFsIGFuZCB3ZSBjYW4gc2VlIHRoYXQgdGhlc2UgYXJlICJyZWFsIiBmaWd1cmVzLiANCg0KPGJyPg0KDQpgYGB7cn0NCmhubyAlPiUgDQogIGdncGxvdChhZXMoeCA9IG1hbGVfcGVyY2VudCkpICsgDQogIGdlb21fZGVuc2l0eShjb2xvdXIgPSAiYmx1ZSIsIGFscGhhID0gLjcpICsgDQogIGdlb21faGlzdG9ncmFtKGJpbnMgPSA1MCwgYWxwaGEgPSAuOCkgKyANCiAgc2NhbGVfeF9sb2cxMChsYWJlbHMgPSBwZXJjZW50KSArIA0KICBsYWJzKHRpdGxlID0gIk5vcm1hbCBkaXN0cmlidXRpb24gb2YgbWVuIGFzIHBlcmNlbnRhZ2Ugb2YgUElOIGluIFN5cmlhIiwgDQogICAgICAgeCA9ICJNYWxlcyBhcyAlIG9mIHRvdGFsIiwgDQogICAgICAgeSA9ICJOdW1iZXIgb2Ygc3ViLWRpc3RyaWN0cyIpDQpgYGANCg0KDQo8YnI+IA0KDQoNClVudGlsIHN1Y2ggdGltZSBjb3B5L3Bhc3RlZCB2YWx1ZXMgYXJlIGV4Y2x1ZGVkIGZyb20gdGhlIHNleC1hbmQtYWdlIGRpc2dncmVnYXRpb25zLCBpdCB3b3VsZCBiZSBpbmNvcnJlY3QgdG8gZXN0aW1hdGUgdGhlIG51bWJlciBvZiBtZW4sIHdvbWVuLCBib3lzIGFuZCBnaXJscyByZWFjaGVkIGZyb20gdGhlIDRXIHZhbHVlcy4gVGhpcyBhbHNvIG1lYW5zIHRoYXQgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGRldGVybWluZSBpZiB0aGVyZSBpcyBhIHNrZXcgdG93YXJkcyBlaXRoZXIgc2V4IGluIG91ciBjdXJyZW50IHByb2dyYW1taW5nLiANCg0KDQoNCg0KDQoNCg0KDQo=